{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "id": "gv6nx80K4QNK"
      },
      "source": [
        "import numpy as np\n",
        "import pandas as pd \n",
        "from keras.preprocessing.image import ImageDataGenerator, load_img\n",
        "from keras.utils import to_categorical\n",
        "from sklearn.model_selection import train_test_split\n",
        "import matplotlib.pyplot as plt\n",
        "import random\n",
        "import os"
      ],
      "execution_count": 1,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iT0un9wb7QEb"
      },
      "source": [
        "Define constants"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XcFGFv2o7N1u"
      },
      "source": [
        "FAST_RUN = False\n",
        "IMAGE_WIDTH=128\n",
        "IMAGE_HEIGHT=128\n",
        "IMAGE_SIZE=(IMAGE_WIDTH, IMAGE_HEIGHT)\n",
        "IMAGE_CHANNELS=3"
      ],
      "execution_count": 2,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JtsAalz-7TmB"
      },
      "source": [
        "Prepare data"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "s_iDUIM77Vk4"
      },
      "source": [
        "Download data and save it"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_05v3CbN7RpR"
      },
      "source": [
        "url = 'https://drive.google.com/file/d/1gjbSZV5NjjIVOqSP-yTCqXcGPX9PnYn5/view?usp=sharing'"
      ],
      "execution_count": 3,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Fp1FQpyd7jwo",
        "outputId": "a8108c81-9a38-4a62-d89f-12388ee26cfb",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "!gdown --id 1gjbSZV5NjjIVOqSP-yTCqXcGPX9PnYn5"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1gjbSZV5NjjIVOqSP-yTCqXcGPX9PnYn5\n",
            "To: /content/MM17-WeiboRumorSet.zip\n",
            "1.35GB [00:18, 74.8MB/s]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hYPHGO1E7uh6"
      },
      "source": [
        "Unzip and save into folder train_extracted"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "rhviYA0i7spi"
      },
      "source": [
        "import zipfile\n",
        "with zipfile.ZipFile(\"MM17-WeiboRumorSet.zip\",\"r\") as zip_ref:\n",
        "    zip_ref.extractall(\"./train_extracted\")"
      ],
      "execution_count": 5,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pWLQXyRB74iI"
      },
      "source": [
        "Exract labels from image names and save image names with corresponding labels in dataframe"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Pk6D3XmT72dg"
      },
      "source": [
        "filenames1 = os.listdir(\"./train_extracted/MM17-WeiboRumorSet/rumor_images\")\n",
        "filenames01 = []\n",
        "categories1 = []\n",
        "for filename in filenames1:\n",
        "    category = 1 # rumor\n",
        "    categories1.append(1)\n",
        "    s = \"rumor_images/\"+str(filename)\n",
        "    filenames01.append(s)\n",
        "\n",
        "df1 = pd.DataFrame({\n",
        "    'filename': filenames01,\n",
        "    'category': categories1\n",
        "})"
      ],
      "execution_count": 6,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bHnbciSU8dYZ",
        "outputId": "aabd9040-d0bf-4228-bc93-1c77c715e8a8",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        }
      },
      "source": [
        "df1.head()"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>filename</th>\n",
              "      <th>category</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>rumor_images/0062SQMfjw1er5h3sjsduj30go0b4mxy.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>rumor_images/48d702e4jw1eaemtw7ltzj20zk0e8dme.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>rumor_images/0067agZ4jw1es9cldrayrj308l064mx3.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>rumor_images/71d4be65gw1eee2e0hca7j20oc0f741e.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>rumor_images/005C3vAljw1ep6zsunu6pj30gd0m8ab5.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                            filename  category\n",
              "0  rumor_images/0062SQMfjw1er5h3sjsduj30go0b4mxy.jpg         1\n",
              "1  rumor_images/48d702e4jw1eaemtw7ltzj20zk0e8dme.jpg         1\n",
              "2  rumor_images/0067agZ4jw1es9cldrayrj308l064mx3.jpg         1\n",
              "3  rumor_images/71d4be65gw1eee2e0hca7j20oc0f741e.jpg         1\n",
              "4  rumor_images/005C3vAljw1ep6zsunu6pj30gd0m8ab5.jpg         1"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 7
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "q9PJWG2A87dJ",
        "outputId": "87ff655e-eae1-413f-8a10-d5741c50b6a3",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "len(df1) # number of rumor images"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "7954"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 8
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "s3x7rXsP8ebo"
      },
      "source": [
        "filenames2 = os.listdir(\"./train_extracted/MM17-WeiboRumorSet/nonrumor_images\")\n",
        "filenames02 = []\n",
        "categories2 = []\n",
        "for filename in filenames2:\n",
        "    category2 = 0 # rumor\n",
        "    categories2.append(0)\n",
        "    s = \"nonrumor_images/\"+str(filename)\n",
        "    filenames02.append(s)\n",
        "\n",
        "df2 = pd.DataFrame({\n",
        "    'filename': filenames02,\n",
        "    'category': categories2\n",
        "})"
      ],
      "execution_count": 9,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "9SWw95p98wPA",
        "outputId": "a1a9db92-f8db-40bd-b7d4-bbbd748cf442",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        }
      },
      "source": [
        "df2.head()"
      ],
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>filename</th>\n",
              "      <th>category</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>nonrumor_images/593bbc68gw1eyu8xr22qwj20c80qog...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>nonrumor_images/6a5ce645jw1ezu74jn618j20c8096a...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>nonrumor_images/61e6c012jw1ezfi3q48epj20c8282w...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>nonrumor_images/6a5ce645jw1ezefna2nokj20bv0ctd...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>nonrumor_images/61e6c012jw1ezjxnp33f0j20c80he4...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                            filename  category\n",
              "0  nonrumor_images/593bbc68gw1eyu8xr22qwj20c80qog...         0\n",
              "1  nonrumor_images/6a5ce645jw1ezu74jn618j20c8096a...         0\n",
              "2  nonrumor_images/61e6c012jw1ezfi3q48epj20c8282w...         0\n",
              "3  nonrumor_images/6a5ce645jw1ezefna2nokj20bv0ctd...         0\n",
              "4  nonrumor_images/61e6c012jw1ezjxnp33f0j20c80he4...         0"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 10
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7d2VfS1D89Yr",
        "outputId": "24e45ef6-9566-4fda-f112-d6852832bf97",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "len(df2) # number of non rumor images"
      ],
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "5318"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 11
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "uZ42s8Ro_6Va"
      },
      "source": [
        "df = df1.append(df2, ignore_index=True).reset_index(drop = True)"
      ],
      "execution_count": 12,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_fIUquAhAZB-",
        "outputId": "7f9c5d61-1f5a-40f2-bde0-0c3eb5462777",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        }
      },
      "source": [
        "df.head()"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>filename</th>\n",
              "      <th>category</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>rumor_images/0062SQMfjw1er5h3sjsduj30go0b4mxy.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>rumor_images/48d702e4jw1eaemtw7ltzj20zk0e8dme.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>rumor_images/0067agZ4jw1es9cldrayrj308l064mx3.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>rumor_images/71d4be65gw1eee2e0hca7j20oc0f741e.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>rumor_images/005C3vAljw1ep6zsunu6pj30gd0m8ab5.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                            filename  category\n",
              "0  rumor_images/0062SQMfjw1er5h3sjsduj30go0b4mxy.jpg         1\n",
              "1  rumor_images/48d702e4jw1eaemtw7ltzj20zk0e8dme.jpg         1\n",
              "2  rumor_images/0067agZ4jw1es9cldrayrj308l064mx3.jpg         1\n",
              "3  rumor_images/71d4be65gw1eee2e0hca7j20oc0f741e.jpg         1\n",
              "4  rumor_images/005C3vAljw1ep6zsunu6pj30gd0m8ab5.jpg         1"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 13
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "2pH2wtpWAZ--",
        "outputId": "9cce1cb7-a916-4bce-f67a-5511d333b5e3",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "len(df) # combined"
      ],
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "13272"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 14
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "1-FVPif5AbDG",
        "outputId": "6a5c5edd-a59c-45c2-bd4f-50f511f3faf7",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 296
        }
      },
      "source": [
        "df.describe()"
      ],
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>category</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>count</th>\n",
              "      <td>13272.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>mean</th>\n",
              "      <td>0.599307</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>std</th>\n",
              "      <td>0.490057</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>min</th>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>25%</th>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>50%</th>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>75%</th>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>max</th>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "           category\n",
              "count  13272.000000\n",
              "mean       0.599307\n",
              "std        0.490057\n",
              "min        0.000000\n",
              "25%        0.000000\n",
              "50%        1.000000\n",
              "75%        1.000000\n",
              "max        1.000000"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 15
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xEICoXREAe7W",
        "outputId": "79097b68-0931-4d0e-a8a9-c3e9043e9ffe",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        }
      },
      "source": [
        "df.tail()"
      ],
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>filename</th>\n",
              "      <th>category</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>13267</th>\n",
              "      <td>nonrumor_images/66eeadffjw1eynry1ltilj20go0m8d...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13268</th>\n",
              "      <td>nonrumor_images/6a5ce645jw1ezefndxpnnj20c50bwg...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13269</th>\n",
              "      <td>nonrumor_images/470bf257jw1eue540s1zuj20hr0e6j...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13270</th>\n",
              "      <td>nonrumor_images/6693ce84gw1ez0r8sv77oj20c836zh...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13271</th>\n",
              "      <td>nonrumor_images/625ab309jw1eyhkiz1jmkj20bl0gnm...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                                filename  category\n",
              "13267  nonrumor_images/66eeadffjw1eynry1ltilj20go0m8d...         0\n",
              "13268  nonrumor_images/6a5ce645jw1ezefndxpnnj20c50bwg...         0\n",
              "13269  nonrumor_images/470bf257jw1eue540s1zuj20hr0e6j...         0\n",
              "13270  nonrumor_images/6693ce84gw1ez0r8sv77oj20c836zh...         0\n",
              "13271  nonrumor_images/625ab309jw1eyhkiz1jmkj20bl0gnm...         0"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 16
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Pm3W4A0BBFex"
      },
      "source": [
        "Total count"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "nwsJEYNoAnad",
        "outputId": "b2e21c4e-56ee-43ea-9d1e-2fa6f0cdda78",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "label_counts = df.groupby('category').size()\n",
        "print(label_counts)"
      ],
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "category\n",
            "0    5318\n",
            "1    7954\n",
            "dtype: int64\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Hr5bn68EA5zF",
        "outputId": "f75fae81-7384-4736-c775-2305269d0758",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 279
        }
      },
      "source": [
        "df['category'].value_counts().plot.bar()"
      ],
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.axes._subplots.AxesSubplot at 0x7fd61973b630>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 18
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "B8SOMjuFBIZC"
      },
      "source": [
        "Sample image"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Zu95Vqf5ICnG"
      },
      "source": [
        "Shuffle df"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "tOkhf8xkIEQm"
      },
      "source": [
        "# shuffle the DataFrame rows \n",
        "df = df.sample(frac = 1).reset_index(drop=True) "
      ],
      "execution_count": 19,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Wz6egnsyIO6G",
        "outputId": "13d8c58d-5570-4d78-8f63-07f78c38aeac",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        }
      },
      "source": [
        "df.head()"
      ],
      "execution_count": 20,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>filename</th>\n",
              "      <th>category</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>nonrumor_images/4e5b54d8gw1eyldltzmewj20c80h7d...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>rumor_images/488c1a9djw1e4212zhwpij20dc0nqq68.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>nonrumor_images/684ebae3jw1eyj1dwmhxkj20c80ho7...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>nonrumor_images/61e04755jw1ezry8nnimwj20b40ak7...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>rumor_images/633f6f25jw1dz7jrlvisgj.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                            filename  category\n",
              "0  nonrumor_images/4e5b54d8gw1eyldltzmewj20c80h7d...         0\n",
              "1  rumor_images/488c1a9djw1e4212zhwpij20dc0nqq68.jpg         1\n",
              "2  nonrumor_images/684ebae3jw1eyj1dwmhxkj20c80ho7...         0\n",
              "3  nonrumor_images/61e04755jw1ezry8nnimwj20b40ak7...         0\n",
              "4            rumor_images/633f6f25jw1dz7jrlvisgj.jpg         1"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 20
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "T4QGsffWIUje",
        "outputId": "43f7f3dd-ed00-48fc-e3e6-06969c209687",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        }
      },
      "source": [
        "df.tail()"
      ],
      "execution_count": 21,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>filename</th>\n",
              "      <th>category</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>13267</th>\n",
              "      <td>rumor_images/9f020129tw1dy0etjr1nxj.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13268</th>\n",
              "      <td>nonrumor_images/61ff32dejw1ez3xdjo2w7j20qo0f0d...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13269</th>\n",
              "      <td>nonrumor_images/593bbc68gw1ezbl86bvnzj20ci08q7...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13270</th>\n",
              "      <td>nonrumor_images/620beb06gw1eyok03zpcxj20c806w3...</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13271</th>\n",
              "      <td>rumor_images/005PvtzXjw1elk3gmmwhej30e80j440f.jpg</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                                filename  category\n",
              "13267            rumor_images/9f020129tw1dy0etjr1nxj.jpg         1\n",
              "13268  nonrumor_images/61ff32dejw1ez3xdjo2w7j20qo0f0d...         0\n",
              "13269  nonrumor_images/593bbc68gw1ezbl86bvnzj20ci08q7...         0\n",
              "13270  nonrumor_images/620beb06gw1eyok03zpcxj20c806w3...         0\n",
              "13271  rumor_images/005PvtzXjw1elk3gmmwhej30e80j440f.jpg         1"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 21
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "X28HYdciIS-O"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "RkVovi9qDrBp"
      },
      "source": [
        "Make a combined list with rumor and non rumor image paths last part"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QpX-qX_yGWgx",
        "outputId": "c9042c1c-80a7-49ca-9232-94459ba26dba",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "filenames = []\n",
        "categories = []\n",
        "for i in range(0, len(df)):\n",
        "  filenames.append(str(df['filename'][i]))\n",
        "  categories.append((df['category'][i]))\n",
        "print(len(filenames))\n",
        "print(len(categories))"
      ],
      "execution_count": 22,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "13272\n",
            "13272\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "DQT75R37DViw",
        "outputId": "9657d845-f3c1-4b2a-d0f2-73d33ec33f33",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "print(filenames[0])\n",
        "print(categories[0])\n",
        "print(filenames[-1])\n",
        "print(categories[-1])"
      ],
      "execution_count": 23,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "nonrumor_images/4e5b54d8gw1eyldltzmewj20c80h7di3.jpg\n",
            "0\n",
            "rumor_images/005PvtzXjw1elk3gmmwhej30e80j440f.jpg\n",
            "1\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "TNMAZ1nfCzsl",
        "outputId": "9efde18e-f4b4-48e5-9cec-07f92297da63",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 304
        }
      },
      "source": [
        "sample = random.choice(filenames)\n",
        "print(sample)\n",
        "image = load_img(\"./train_extracted/MM17-WeiboRumorSet/\"+sample)\n",
        "plt.imshow(image)"
      ],
      "execution_count": 24,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "rumor_images/9b2b4fa5jw1ev1e2twahoj20f00qomy9.jpg\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.image.AxesImage at 0x7fd61913efd0>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 24
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3XiFNN94EAWH"
      },
      "source": [
        "Build Model\n",
        "\n",
        "\n",
        "Input Layer: It represent input image data. It will reshape image into single diminsion array. Example your image is 64x64 = 4096, it will convert to (4096,1) array.\n",
        "\n",
        "Conv Layer: This layer will extract features from image.\n",
        "\n",
        "Pooling Layer: This layerreduce the spatial volume of input image after convolution.\n",
        "\n",
        "Fully Connected Layer: It connect the network from a layer to another layer\n",
        "\n",
        "Output Layer: It is the predicted values layer."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XEFX8V1lDf6d",
        "outputId": "3e36cc8d-2a19-4964-9881-b83528ec1457",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "from keras.models import Sequential\n",
        "from keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense, Activation, BatchNormalization\n",
        "\n",
        "model = Sequential()\n",
        "\n",
        "model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_CHANNELS)))\n",
        "model.add(BatchNormalization())\n",
        "model.add(MaxPooling2D(pool_size=(2, 2)))\n",
        "model.add(Dropout(0.25))\n",
        "\n",
        "model.add(Conv2D(64, (3, 3), activation='relu'))\n",
        "model.add(BatchNormalization())\n",
        "model.add(MaxPooling2D(pool_size=(2, 2)))\n",
        "model.add(Dropout(0.25))\n",
        "\n",
        "model.add(Flatten())\n",
        "model.add(Dense(512, activation='relu'))\n",
        "model.add(BatchNormalization())\n",
        "model.add(Dropout(0.5))\n",
        "model.add(Dense(2, activation='softmax')) # 2 because we have 2 classes\n",
        "\n",
        "model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])\n",
        "\n",
        "model.summary()"
      ],
      "execution_count": 25,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "conv2d (Conv2D)              (None, 126, 126, 32)      896       \n",
            "_________________________________________________________________\n",
            "batch_normalization (BatchNo (None, 126, 126, 32)      128       \n",
            "_________________________________________________________________\n",
            "max_pooling2d (MaxPooling2D) (None, 63, 63, 32)        0         \n",
            "_________________________________________________________________\n",
            "dropout (Dropout)            (None, 63, 63, 32)        0         \n",
            "_________________________________________________________________\n",
            "conv2d_1 (Conv2D)            (None, 61, 61, 64)        18496     \n",
            "_________________________________________________________________\n",
            "batch_normalization_1 (Batch (None, 61, 61, 64)        256       \n",
            "_________________________________________________________________\n",
            "max_pooling2d_1 (MaxPooling2 (None, 30, 30, 64)        0         \n",
            "_________________________________________________________________\n",
            "dropout_1 (Dropout)          (None, 30, 30, 64)        0         \n",
            "_________________________________________________________________\n",
            "flatten (Flatten)            (None, 57600)             0         \n",
            "_________________________________________________________________\n",
            "dense (Dense)                (None, 512)               29491712  \n",
            "_________________________________________________________________\n",
            "batch_normalization_2 (Batch (None, 512)               2048      \n",
            "_________________________________________________________________\n",
            "dropout_2 (Dropout)          (None, 512)               0         \n",
            "_________________________________________________________________\n",
            "dense_1 (Dense)              (None, 2)                 1026      \n",
            "=================================================================\n",
            "Total params: 29,514,562\n",
            "Trainable params: 29,513,346\n",
            "Non-trainable params: 1,216\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GTsRkNZlEp9S"
      },
      "source": [
        "Callbacks"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "v9olGx-1Elzn"
      },
      "source": [
        "from keras.callbacks import EarlyStopping, ReduceLROnPlateau"
      ],
      "execution_count": 26,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vlLvxlhiEwcY"
      },
      "source": [
        "Early Stop\n",
        "\n",
        "To prevent over fitting we will stop the learning after 10 epochs and val_loss value not decreased"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "1myMXGP7Et10"
      },
      "source": [
        "earlystop = EarlyStopping(patience=10)"
      ],
      "execution_count": 27,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "HAFClnwJE3VD"
      },
      "source": [
        "Learning Rate Reduction\n",
        "\n",
        "We will reduce the learning rate when then accuracy not increase for 2 steps"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "9iT9fy0TE1Yb"
      },
      "source": [
        "learning_rate_reduction = ReduceLROnPlateau(monitor='val_accuracy', \n",
        "                                            patience=2, \n",
        "                                            verbose=1, \n",
        "                                            factor=0.5, \n",
        "                                            min_lr=0.00001)"
      ],
      "execution_count": 28,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "30fgqmTjE6aT"
      },
      "source": [
        "callbacks = [earlystop, learning_rate_reduction]"
      ],
      "execution_count": 29,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Ilc_GkWHFHXY"
      },
      "source": [
        "Prepare data\n",
        "\n",
        "Because we will use image genaretor with class_mode=\"categorical\". We need to convert column category into string. Then imagenerator will convert it one-hot encoding which is good for our classification.\n",
        "\n",
        "So we will convert 1 to rumor and 0 to nonrumor"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "x4vPWpOwE9ss"
      },
      "source": [
        "df[\"category\"] = df[\"category\"].replace({0: 'nonrumor', 1: 'rumor'}) "
      ],
      "execution_count": 30,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "IYBab-iIIkHP",
        "outputId": "5e5d9e9a-315f-4957-a330-6dbe668ff415",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        }
      },
      "source": [
        "df.head()"
      ],
      "execution_count": 31,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>filename</th>\n",
              "      <th>category</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>nonrumor_images/4e5b54d8gw1eyldltzmewj20c80h7d...</td>\n",
              "      <td>nonrumor</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>rumor_images/488c1a9djw1e4212zhwpij20dc0nqq68.jpg</td>\n",
              "      <td>rumor</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>nonrumor_images/684ebae3jw1eyj1dwmhxkj20c80ho7...</td>\n",
              "      <td>nonrumor</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>nonrumor_images/61e04755jw1ezry8nnimwj20b40ak7...</td>\n",
              "      <td>nonrumor</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>rumor_images/633f6f25jw1dz7jrlvisgj.jpg</td>\n",
              "      <td>rumor</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                            filename  category\n",
              "0  nonrumor_images/4e5b54d8gw1eyldltzmewj20c80h7d...  nonrumor\n",
              "1  rumor_images/488c1a9djw1e4212zhwpij20dc0nqq68.jpg     rumor\n",
              "2  nonrumor_images/684ebae3jw1eyj1dwmhxkj20c80ho7...  nonrumor\n",
              "3  nonrumor_images/61e04755jw1ezry8nnimwj20b40ak7...  nonrumor\n",
              "4            rumor_images/633f6f25jw1dz7jrlvisgj.jpg     rumor"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 31
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9vGd-5OuJxGK"
      },
      "source": [
        "Divide into 80% train and 20% test, Note that we have shuffled earlier"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "PHvSkqYpIlEC",
        "outputId": "14f14f84-9f74-4ea3-c30a-5f31864de22e",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "mid = int(len(df)*0.8)\n",
        "df_train = df[:mid]\n",
        "df_test = df[mid:]\n",
        "print(len(df_train))\n",
        "print(len(df_test))"
      ],
      "execution_count": 32,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "10617\n",
            "2655\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JdHhrULaJytp"
      },
      "source": [
        "train_df, validate_df = train_test_split(df_train, test_size=0.20, random_state=42)\n",
        "train_df = train_df.reset_index(drop=True)\n",
        "validate_df = validate_df.reset_index(drop=True)"
      ],
      "execution_count": 33,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "89DDqmY2lXn1"
      },
      "source": [
        ""
      ],
      "execution_count": 33,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "U_vv7UUvJ06a",
        "outputId": "21600f17-7939-4d3c-b03e-7fa7cfab78df",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 321
        }
      },
      "source": [
        "train_df['category'].value_counts().plot.bar()"
      ],
      "execution_count": 34,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.axes._subplots.AxesSubplot at 0x7fd6190f8c18>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 34
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Ehgi-u8KJ4oi",
        "outputId": "e845644d-a432-44ed-8fed-e891d50d5338",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 321
        }
      },
      "source": [
        "validate_df['category'].value_counts().plot.bar()"
      ],
      "execution_count": 35,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.axes._subplots.AxesSubplot at 0x7fd610178630>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 35
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QSP4mXwoJ8Ph"
      },
      "source": [
        "total_train = train_df.shape[0]\n",
        "total_validate = validate_df.shape[0]\n",
        "batch_size=32"
      ],
      "execution_count": 36,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UYUi4feTKBcc"
      },
      "source": [
        "Traning Generator"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "d_ojPtyjJ-qR",
        "outputId": "caa8a04c-8665-48ca-d0c9-063f58c4fb61",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "train_datagen = ImageDataGenerator(\n",
        "    rotation_range=15,\n",
        "    rescale=1./255,\n",
        "    shear_range=0.1,\n",
        "    zoom_range=0.2,\n",
        "    horizontal_flip=True,\n",
        "    width_shift_range=0.1,\n",
        "    height_shift_range=0.1\n",
        ")\n",
        "\n",
        "train_generator = train_datagen.flow_from_dataframe(\n",
        "    train_df, \n",
        "    \"./train_extracted/MM17-WeiboRumorSet/\", \n",
        "    x_col='filename',\n",
        "    y_col='category',\n",
        "    target_size=IMAGE_SIZE,\n",
        "    class_mode='categorical',\n",
        "    batch_size=batch_size\n",
        ")"
      ],
      "execution_count": 37,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Found 8475 validated image filenames belonging to 2 classes.\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/keras_preprocessing/image/dataframe_iterator.py:282: UserWarning: Found 18 invalid image filename(s) in x_col=\"filename\". These filename(s) will be ignored.\n",
            "  .format(n_invalid, x_col)\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "llVLhuxYKh2N"
      },
      "source": [
        "Validation Generator"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ijwdyzmvKc4Y",
        "outputId": "b4385e80-d536-4111-aea6-40e2830492a9",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "validation_datagen = ImageDataGenerator(rescale=1./255)\n",
        "validation_generator = validation_datagen.flow_from_dataframe(\n",
        "    validate_df, \n",
        "    \"./train_extracted/MM17-WeiboRumorSet/\", \n",
        "    x_col='filename',\n",
        "    y_col='category',\n",
        "    target_size=IMAGE_SIZE,\n",
        "    class_mode='categorical',\n",
        "    batch_size=batch_size\n",
        ")"
      ],
      "execution_count": 38,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Found 2122 validated image filenames belonging to 2 classes.\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/keras_preprocessing/image/dataframe_iterator.py:282: UserWarning: Found 2 invalid image filename(s) in x_col=\"filename\". These filename(s) will be ignored.\n",
            "  .format(n_invalid, x_col)\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mVVVotrcK2P7"
      },
      "source": [
        "See how our generator work"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "VtfGbdKXKs_B",
        "outputId": "9b0091fc-03e0-4f56-bcc8-c835b515f411",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "example_df = train_df.sample(n=1).reset_index(drop=True)\n",
        "example_generator = train_datagen.flow_from_dataframe(\n",
        "    example_df, \n",
        "    \"./train_extracted/MM17-WeiboRumorSet/\", \n",
        "    x_col='filename',\n",
        "    y_col='category',\n",
        "    target_size=IMAGE_SIZE,\n",
        "    class_mode='categorical'\n",
        ")"
      ],
      "execution_count": 39,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Found 1 validated image filenames belonging to 1 classes.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "IgVpi6rfLOVh"
      },
      "source": [
        "Seems great"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "G4bJtNoKLQNf"
      },
      "source": [
        "Fit Model"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "iJW0H0FJOFoG"
      },
      "source": [
        "FAST_RUN = False"
      ],
      "execution_count": 40,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "iYK7nnTtLE6y",
        "outputId": "bff77415-eb85-4695-dd54-8f561df53af4",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "epochs=3 if FAST_RUN else 20\n",
        "history = model.fit_generator(\n",
        "    train_generator, \n",
        "    epochs=epochs,\n",
        "    validation_data=validation_generator,\n",
        "    validation_steps=total_validate//batch_size,\n",
        "    steps_per_epoch=total_train//batch_size,\n",
        "    callbacks=callbacks\n",
        ")"
      ],
      "execution_count": 41,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "WARNING:tensorflow:From <ipython-input-41-28f6c98b1462>:8: Model.fit_generator (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Please use Model.fit, which supports generators.\n",
            "Epoch 1/20\n",
            "265/265 [==============================] - 105s 397ms/step - loss: 0.9798 - accuracy: 0.5522 - val_loss: 0.7007 - val_accuracy: 0.5521\n",
            "Epoch 2/20\n",
            "265/265 [==============================] - 105s 395ms/step - loss: 0.7123 - accuracy: 0.5886 - val_loss: 0.6494 - val_accuracy: 0.5966\n",
            "Epoch 3/20\n",
            "265/265 [==============================] - 104s 391ms/step - loss: 0.6675 - accuracy: 0.6025 - val_loss: 0.6318 - val_accuracy: 0.6293\n",
            "Epoch 4/20\n",
            "265/265 [==============================] - 103s 390ms/step - loss: 0.6509 - accuracy: 0.6181 - val_loss: 0.6659 - val_accuracy: 0.5909\n",
            "Epoch 5/20\n",
            "265/265 [==============================] - 103s 390ms/step - loss: 0.6407 - accuracy: 0.6235 - val_loss: 0.6081 - val_accuracy: 0.6496\n",
            "Epoch 6/20\n",
            "265/265 [==============================] - 103s 387ms/step - loss: 0.6315 - accuracy: 0.6374 - val_loss: 0.8040 - val_accuracy: 0.5597\n",
            "Epoch 7/20\n",
            "265/265 [==============================] - ETA: 0s - loss: 0.6376 - accuracy: 0.6345\n",
            "Epoch 00007: ReduceLROnPlateau reducing learning rate to 0.0005000000237487257.\n",
            "265/265 [==============================] - 103s 387ms/step - loss: 0.6376 - accuracy: 0.6345 - val_loss: 0.6636 - val_accuracy: 0.6226\n",
            "Epoch 8/20\n",
            "265/265 [==============================] - 102s 385ms/step - loss: 0.6095 - accuracy: 0.6552 - val_loss: 0.6029 - val_accuracy: 0.6728\n",
            "Epoch 9/20\n",
            "265/265 [==============================] - 102s 385ms/step - loss: 0.6011 - accuracy: 0.6604 - val_loss: 0.6267 - val_accuracy: 0.6733\n",
            "Epoch 10/20\n",
            "265/265 [==============================] - 102s 384ms/step - loss: 0.6021 - accuracy: 0.6675 - val_loss: 0.5914 - val_accuracy: 0.6884\n",
            "Epoch 11/20\n",
            "265/265 [==============================] - 101s 381ms/step - loss: 0.5986 - accuracy: 0.6715 - val_loss: 0.5771 - val_accuracy: 0.6870\n",
            "Epoch 12/20\n",
            "265/265 [==============================] - 101s 381ms/step - loss: 0.5908 - accuracy: 0.6762 - val_loss: 0.5773 - val_accuracy: 0.6955\n",
            "Epoch 13/20\n",
            "265/265 [==============================] - 101s 382ms/step - loss: 0.5940 - accuracy: 0.6667 - val_loss: 0.6135 - val_accuracy: 0.6742\n",
            "Epoch 14/20\n",
            "265/265 [==============================] - 100s 378ms/step - loss: 0.5929 - accuracy: 0.6752 - val_loss: 0.5717 - val_accuracy: 0.7041\n",
            "Epoch 15/20\n",
            "265/265 [==============================] - 100s 378ms/step - loss: 0.5880 - accuracy: 0.6754 - val_loss: 0.5572 - val_accuracy: 0.7116\n",
            "Epoch 16/20\n",
            "265/265 [==============================] - 101s 380ms/step - loss: 0.5829 - accuracy: 0.6827 - val_loss: 0.5652 - val_accuracy: 0.7102\n",
            "Epoch 17/20\n",
            "265/265 [==============================] - ETA: 0s - loss: 0.5834 - accuracy: 0.6839\n",
            "Epoch 00017: ReduceLROnPlateau reducing learning rate to 0.0002500000118743628.\n",
            "265/265 [==============================] - 100s 376ms/step - loss: 0.5834 - accuracy: 0.6839 - val_loss: 0.6205 - val_accuracy: 0.6965\n",
            "Epoch 18/20\n",
            "265/265 [==============================] - 102s 386ms/step - loss: 0.5646 - accuracy: 0.7027 - val_loss: 0.6951 - val_accuracy: 0.6553\n",
            "Epoch 19/20\n",
            "265/265 [==============================] - ETA: 0s - loss: 0.5661 - accuracy: 0.6997\n",
            "Epoch 00019: ReduceLROnPlateau reducing learning rate to 0.0001250000059371814.\n",
            "265/265 [==============================] - 102s 384ms/step - loss: 0.5661 - accuracy: 0.6997 - val_loss: 0.5646 - val_accuracy: 0.7083\n",
            "Epoch 20/20\n",
            "265/265 [==============================] - 101s 381ms/step - loss: 0.5617 - accuracy: 0.7022 - val_loss: 0.5576 - val_accuracy: 0.7249\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hqmvDWKSO2-w"
      },
      "source": [
        "Save Model"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3HUVXwMKO3gJ"
      },
      "source": [
        "model.save_weights(\"model.h5\")"
      ],
      "execution_count": 42,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "t9gbIiI3VHfZ"
      },
      "source": [
        "model.save_weights(\"2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020Rumor_Nonrumor_50epochs_model.h5\")"
      ],
      "execution_count": 43,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "eQw6YuLRq3tT"
      },
      "source": [
        "# saving the dataframe \n",
        "df.to_csv('2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020df_5331.csv') "
      ],
      "execution_count": 44,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "RJ70WX4tq8s1"
      },
      "source": [
        "# saving the dataframe \n",
        "df_train.to_csv('2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020df_train_5331.csv')\n",
        "# saving the dataframe \n",
        "df_test.to_csv('2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020df_test_5331.csv') "
      ],
      "execution_count": 45,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "K3if-P8VVMLZ",
        "outputId": "9f578fc3-5761-49f4-c0b6-597d7c5dfe4d",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 51
        }
      },
      "source": [
        "from google.colab import files\n",
        "files.download('2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020Rumor_Nonrumor_50epochs_model.h5') "
      ],
      "execution_count": 46,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "\n",
              "    async function download(id, filename, size) {\n",
              "      if (!google.colab.kernel.accessAllowed) {\n",
              "        return;\n",
              "      }\n",
              "      const div = document.createElement('div');\n",
              "      const label = document.createElement('label');\n",
              "      label.textContent = `Downloading \"${filename}\": `;\n",
              "      div.appendChild(label);\n",
              "      const progress = document.createElement('progress');\n",
              "      progress.max = size;\n",
              "      div.appendChild(progress);\n",
              "      document.body.appendChild(div);\n",
              "\n",
              "      const buffers = [];\n",
              "      let downloaded = 0;\n",
              "\n",
              "      const channel = await google.colab.kernel.comms.open(id);\n",
              "      // Send a message to notify the kernel that we're ready.\n",
              "      channel.send({})\n",
              "\n",
              "      for await (const message of channel.messages) {\n",
              "        // Send a message to notify the kernel that we're ready.\n",
              "        channel.send({})\n",
              "        if (message.buffers) {\n",
              "          for (const buffer of message.buffers) {\n",
              "            buffers.push(buffer);\n",
              "            downloaded += buffer.byteLength;\n",
              "            progress.value = downloaded;\n",
              "          }\n",
              "        }\n",
              "      }\n",
              "      const blob = new Blob(buffers, {type: 'application/binary'});\n",
              "      const a = document.createElement('a');\n",
              "      a.href = window.URL.createObjectURL(blob);\n",
              "      a.download = filename;\n",
              "      div.appendChild(a);\n",
              "      a.click();\n",
              "      div.remove();\n",
              "    }\n",
              "  "
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "download(\"download_7fb59676-db95-4a18-8971-3983fd0b45f0\", \"2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020Rumor_Nonrumor_50epochs_model.h5\", 118091472)"
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fabeuti9rJgv",
        "outputId": "2a382612-8622-465a-e853-2b292dd95cfd",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 17
        }
      },
      "source": [
        "files.download('2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020df_5331.csv') \n",
        "files.download('2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020df_train_5331.csv') \n",
        "files.download('2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020df_test_5331.csv') "
      ],
      "execution_count": 47,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "\n",
              "    async function download(id, filename, size) {\n",
              "      if (!google.colab.kernel.accessAllowed) {\n",
              "        return;\n",
              "      }\n",
              "      const div = document.createElement('div');\n",
              "      const label = document.createElement('label');\n",
              "      label.textContent = `Downloading \"${filename}\": `;\n",
              "      div.appendChild(label);\n",
              "      const progress = document.createElement('progress');\n",
              "      progress.max = size;\n",
              "      div.appendChild(progress);\n",
              "      document.body.appendChild(div);\n",
              "\n",
              "      const buffers = [];\n",
              "      let downloaded = 0;\n",
              "\n",
              "      const channel = await google.colab.kernel.comms.open(id);\n",
              "      // Send a message to notify the kernel that we're ready.\n",
              "      channel.send({})\n",
              "\n",
              "      for await (const message of channel.messages) {\n",
              "        // Send a message to notify the kernel that we're ready.\n",
              "        channel.send({})\n",
              "        if (message.buffers) {\n",
              "          for (const buffer of message.buffers) {\n",
              "            buffers.push(buffer);\n",
              "            downloaded += buffer.byteLength;\n",
              "            progress.value = downloaded;\n",
              "          }\n",
              "        }\n",
              "      }\n",
              "      const blob = new Blob(buffers, {type: 'application/binary'});\n",
              "      const a = document.createElement('a');\n",
              "      a.href = window.URL.createObjectURL(blob);\n",
              "      a.download = filename;\n",
              "      div.appendChild(a);\n",
              "      a.click();\n",
              "      div.remove();\n",
              "    }\n",
              "  "
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "download(\"download_16090b4d-42ff-4cd3-a73e-46da1fbb06b7\", \"2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020df_5331.csv\", 830161)"
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "\n",
              "    async function download(id, filename, size) {\n",
              "      if (!google.colab.kernel.accessAllowed) {\n",
              "        return;\n",
              "      }\n",
              "      const div = document.createElement('div');\n",
              "      const label = document.createElement('label');\n",
              "      label.textContent = `Downloading \"${filename}\": `;\n",
              "      div.appendChild(label);\n",
              "      const progress = document.createElement('progress');\n",
              "      progress.max = size;\n",
              "      div.appendChild(progress);\n",
              "      document.body.appendChild(div);\n",
              "\n",
              "      const buffers = [];\n",
              "      let downloaded = 0;\n",
              "\n",
              "      const channel = await google.colab.kernel.comms.open(id);\n",
              "      // Send a message to notify the kernel that we're ready.\n",
              "      channel.send({})\n",
              "\n",
              "      for await (const message of channel.messages) {\n",
              "        // Send a message to notify the kernel that we're ready.\n",
              "        channel.send({})\n",
              "        if (message.buffers) {\n",
              "          for (const buffer of message.buffers) {\n",
              "            buffers.push(buffer);\n",
              "            downloaded += buffer.byteLength;\n",
              "            progress.value = downloaded;\n",
              "          }\n",
              "        }\n",
              "      }\n",
              "      const blob = new Blob(buffers, {type: 'application/binary'});\n",
              "      const a = document.createElement('a');\n",
              "      a.href = window.URL.createObjectURL(blob);\n",
              "      a.download = filename;\n",
              "      div.appendChild(a);\n",
              "      a.click();\n",
              "      div.remove();\n",
              "    }\n",
              "  "
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "download(\"download_b825fa35-1d80-4aec-bf78-c8b4674811e9\", \"2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020df_train_5331.csv\", 661529)"
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "\n",
              "    async function download(id, filename, size) {\n",
              "      if (!google.colab.kernel.accessAllowed) {\n",
              "        return;\n",
              "      }\n",
              "      const div = document.createElement('div');\n",
              "      const label = document.createElement('label');\n",
              "      label.textContent = `Downloading \"${filename}\": `;\n",
              "      div.appendChild(label);\n",
              "      const progress = document.createElement('progress');\n",
              "      progress.max = size;\n",
              "      div.appendChild(progress);\n",
              "      document.body.appendChild(div);\n",
              "\n",
              "      const buffers = [];\n",
              "      let downloaded = 0;\n",
              "\n",
              "      const channel = await google.colab.kernel.comms.open(id);\n",
              "      // Send a message to notify the kernel that we're ready.\n",
              "      channel.send({})\n",
              "\n",
              "      for await (const message of channel.messages) {\n",
              "        // Send a message to notify the kernel that we're ready.\n",
              "        channel.send({})\n",
              "        if (message.buffers) {\n",
              "          for (const buffer of message.buffers) {\n",
              "            buffers.push(buffer);\n",
              "            downloaded += buffer.byteLength;\n",
              "            progress.value = downloaded;\n",
              "          }\n",
              "        }\n",
              "      }\n",
              "      const blob = new Blob(buffers, {type: 'application/binary'});\n",
              "      const a = document.createElement('a');\n",
              "      a.href = window.URL.createObjectURL(blob);\n",
              "      a.download = filename;\n",
              "      div.appendChild(a);\n",
              "      a.click();\n",
              "      div.remove();\n",
              "    }\n",
              "  "
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "download(\"download_7f0931fb-3c50-4bb5-9f0e-d1eaea84781a\", \"2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020df_test_5331.csv\", 168651)"
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jtoywaWXkraL",
        "outputId": "8052c8f0-8fae-48f9-bbaf-a6e6a78d85d1",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "model.load_weights(\"model.h5\")\n",
        "print(\"Loaded model from disk\")"
      ],
      "execution_count": 48,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Loaded model from disk\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oxt6QQ-hO8PG"
      },
      "source": [
        "Visualize Training"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4NJQxiabO5h8",
        "outputId": "4b513d99-6a2f-4287-9a3a-1c90fb4ae1b5",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 873
        }
      },
      "source": [
        "fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 12))\n",
        "ax1.plot(history.history['loss'], color='b', label=\"Training loss\")\n",
        "ax1.plot(history.history['val_loss'], color='r', label=\"validation loss\")\n",
        "ax1.set_xticks(np.arange(1, epochs, 1))\n",
        "ax1.set_yticks(np.arange(0, 1, 0.1))\n",
        "\n",
        "ax2.plot(history.history['accuracy'], color='b', label=\"Training accuracy\")\n",
        "ax2.plot(history.history['val_accuracy'], color='r',label=\"Validation accuracy\")\n",
        "ax2.set_xticks(np.arange(1, epochs, 1))\n",
        "\n",
        "legend = plt.legend(loc='best', shadow=True)\n",
        "plt.tight_layout()\n",
        "plt.show()"
      ],
      "execution_count": 49,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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AADKlQhNLgZJmuy9L7fXnfd+lPc+w3ufkZ6eHufSduP4422R0xNP2HWvXpZSvvoq6soqpX17GxBYulS66y7Lh71727fx739LxcVRV4hA/fOf0g8/JNfaq7KcszVk++4rDR0q5edHXREAAHunqEgaO9ZmQiFlhRWwVkhqG3O/zY7HyjNIyTY9sETdutKvfy199511Onv/femoo+zkb9GiqKurlJYt7Zx76VLp8cdtUO6882xU65lnpLy8qCtEteXlWXeT3r1ttDWZtWplLTFnz7ZPBgAASBY5OVLfvlJmpnTOObR3TmFhBawZkjo75zo45+rKQtSUsgc55w6V1EzSJyHVER+NGkm33GKh6qabpJdekg45xMLXDz9EXV2lNGwoDRsmLVwovfCCdSK84grrPHj//dKGDVFXiCp75hn7pOyOO2wUKNn16yddfrlNeUySqbkAgBruk0+sUdMHH9j54axZ0h/+EHVVCEkoAct7XyhpmKRpkr6RNMl7P9c5d7dzrl/MoYMkTfBhtDKMQvPmNlLw3XfSlVdaU4GDD5b++Mek6Y1eu7Y0aJD05ZfSf/9rDeduvllq186uV66MukLslbw86b77pBNOkE49NepqgvPII/ZLeckl0ubNUVcDAED5vJdGjJBOOkmqV8+C1hNPSL/9rV2//HLUFSIEobRpD0vStWnPzrZRgxdesHUjw4dLv/mNDRclkS++sL1pX3zRAlhmpvT730uHHhp1Zdijp56ybibTpklnnBF1NcF6/32b8nj11dLf/x51NQAA7GzTJvvAfdIkm30xerSdD0q2jrhXL5s6NHOmTRlC0ol3m3ZINno1frz9xTnhBAtYBx9sJ4MFBVFXV2nHHCNNmCAtWGD/TowbJx12mK3V+iS5J3emtvx8Wxt47LHS6adHXU3wTjpJuvFGC5FTp0ZdDQAApebOlX7yE2nyZJvd9K9/lYYrydbxT5xoI1yDBtG4KcUQsOKhe3fp9dftE/eOHaVrr7WEMn58UrXr69RJGjnS9ny9/Xb7dk44wXonvPZaUn0rNcPzz1v3kjvvTI21V+W55x7piCNswWBubtTVAABgn0T37GnLQ95+29ZY1CrnlLtjR+vy+/nntgUJUgYBK55697bFja+9Zo0xhgyRevSw8JVEUzVbtZLuvtvO3R991K7PPVc68kjpuef4ECYhFBRI995rn571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pod0o/6s27RV1jq/fv3yR8FiLwccEFADyH/9S7rgAmnMGFsMi8rbsMH2Pfvb32zaxxNP2KgkAKDmKSqy6eP33GPnSJMnS507R11VqfXrbeaF9zZtMMwOhqg0AlZNt327teObPXvny7p1pce0b186ylUSvDp2jG60a8kSm/M8blzp2qLTT7dQdd550Y84rFqloj8MV9rY0cpr1UZfXPyQPmt7kVasdLuEspKpiLFatdpzENt3392Mhnlvi19LWi2ynqhqPv3UmmB89ZX9Xj3+uM0VBQDUDGvW2LnFm29Kl11ms4ESaa11ic8/l3r1si1mXnopMZYp1HAELOzKezv7jx3pmj3bNqQqLrZjGje2T3JipxkeeWR44WbNGmvcMX689OGH9tjxx9s/fAMHWipJNB99ZNPMZs2yRaiPPSZ17fq/p723GZvljYbFXtas2fWlGzSwoHXggdZp/IAD7Hr//aVui/+tHn86TxseG63Gv7qE2YHVUVBg6+ruusuC/L332lotfqgAkNo+/dSWGeTk2EyGK65I7ODy8MO2lczjj9u5ByJFwELlbd2682hXSfhav770mI4ddx3tat++aqNdW7ZI//63happ02zec9euNgd60CB7r0RXVCQ99ZRtBr15s3T99dKdd+5VEM3Lsx4l5YWvH36QVq2y602bJMkrSxlqqg06VN9KabXVqlVp+IoNYmXvN24c2k8hLry3n8H69TYAu359+bf32cf6vRx33F7kpEWLbGPiadOs+cWoUTYlAwCQWry3QHXjjTZrYfJkmxWS6Ly3JRL//a+tSU+GmlMYAQvV47214osd6Zo929rDl/wONWlSurarJHgdeWT5Z/QFBfaPQ0kHwK1bpbZtrQvexRfb1ybyJ0gVycmx/cmeftpSzYMP2vcU4PeyZYu06YXXtP9V5yrrV8/os66/0KpVpQGs5PaPP1pWLatx44rDV+zt9PRwZh16b/1YSsLQ7oJSec9t2FA6wFqRpk0t5xYVSc2b2zK9s8+26z1uI+K97Sd2ww3253nDDdahM9mTKQDAbNpke1tNnGjT7UaPTq41Tbm51uCqfn3piy8Sew19iiNgIRxbt1oDirLTDDdutOeds66FJaNcXbpI771n0wBzc+3s96KLbLSqV6/k7W5Y1uef2xSzrCzbff2JJyxsBsF7qWdP+/nNn19h69jiYjukvPBV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REREJJ9zzv2e2e0qERQREREREQkTJVgiIiIiIiJhogRLREREREQkTHLVHKzM7N27l9WrV7N79+6gQ5EoUbRoUapXr06hQoWCDkVERERE8plcn2CtXr2aUqVKUbNmTQoU0IBcfpecnMymTZtYvnw5tWvX1u+EiIiIiERUrt/73L17N8cff7x2pAWAAgUKUL58eRISEpg5cybe+6BDEhEREZF8JE9kJUquJL0CBQrgnGPx4sXs2rUr6HBEREREJB9RZiJ5VoECBdi7d2/QYYiIiIhIPqIE6wj9/fff1K1bl7p161K+fHlOOOGE1OsH27mfN28effr0OehrNG7cOFzhioiIiIhIDsr1TS6CVqZMGRYtWgTAwIEDKV68OHfddVfq/YmJiRQsmPnH3LBhQxo2bHjQ15g9e3Z4go2gpKQkYmJigg5DRERERCSi8lSC1bcvhHKdsKlbFwYPPrTndO7cmSJFirBw4UKaNGlChw4duOOOO9izZw9HH300w4cPp2bNmsyYMYMXXniBzz77jIEDB7J+/XrWrFnD+vXr6du3b+roVvHixdm1axczZsxg4MCBlC1bll9++YUGDRrw/vvv45zjiy++oH///hQrVowmTZqwZs0aPvvss33iWrduHTfccAP//vsvAK+88krq6Nizzz7L+++/T4ECBbj88st55plnWLVqFd27d+f//u//iImJ4cMPP+SPP/5IjRmgV69eNGzYkM6dO1OlShXat2/P119/zT333ENcXBzDhg1j7969nHzyyYwaNYqiRYuyefNmunfvzpo1awB4/fXXmTJlCqVLl6Zv374APPDAA5QrV4477rjjsH92IiIiIiKRlqcSrGiyYcMGZs+eTUxMDP/88w/fffcdBQsW5JtvvuH+++9nwoQJ+z1nxYoVTJ8+nbi4OGrWrEmPHj046qij9nnMwoULWbp0KRUrVqRJkybMmjWLhg0bctttt/Htt99StWpVOnbsmGlM5cqV4+uvv6ZIkSL89ttvdOzYkXnz5jF58mQ+/vhj5syZQ9GiRdm2bRsAnTp1YsCAAbRu3Zo9e/aQnJzMH3/8ccD3XaZMGRYsWABY+eStt94KwIMPPsg777xD79696dOnDxdccAETJ04kKSmJXbt2UbFiRdq0aUPfvn1JTk4mNjaWn3766ZA/dxERERGRIOWpBOtQR5pyUtu2bVNL5Hbu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NqK45JJLGD58eOocqW3btlGiRAkqVarEpEmTAIiPj2f37t2cdNJJLFu2jPj4eHbs2MHUqVOzfL2s3l+zZs1SSxuTkpLYuXMnAK1bt2bKlCnMnTv3oKN5IiIiIhKwZcugcWNYvx4mT87TyRUowQqbjh07snjx4tQEq06dOtSrV49TTz2V6667jiZNmhzw+fXr16d9+/bUqVOHyy+/nLPOOiv1vscff5yzzz6bJk2acOqpp6be3qFDB55//nnq1avH6tWrU28vUqQIw4cPp23bttSuXZsCBQrQvXv3bL+Xnj178t5771GnTh1WrFiROtrUvHlzWrZsScOGDalbt27q/K1Ro0YxdOhQzjzzTBo3bsymTZs48cQTadeuHWeccQbt2rWjXr16Wb5eVu9vyJAhTJ8+ndq1a9OgQYPUjomFChWiadOmtGvXjpiYmGy/LxERERGJsNmz4dxzISHBFhC+6KKgI8pxznsfdAzZ1rBhQ5+yflSK+fPn06BBg4AikiAkJyendiCsUaNGpo+ZP38+s2bNolOnTpqjJSIiIhKETz6x0aoTT4Qvv4SqVYOOKKycc/O99w0z3q4RLMlVli1bxsknn0yzZs2yTK5EREREJGBvvw2tW0Pt2tbUIo8lVweiJheSq5x++umsWbMm6DBEREREJDPewxNPwMMPW1OLDz+E4sWDjiqi8kSClZycTIECGowTk757oYiIiIhESFIS9O4Nr78ON95oo1h5bI2r7Mj1WUnRokXZtGmTdqoFsORq06ZNJCQkBB2KiIiISP6xZw+0a2fJ1b33wogR+TK5gjwwglW9enV+/vln/vzzT5xzQYcjUSAhIYF169aRnJxMoUKFgg5HREREJG/bscMWEP7uOxg8GO64I+iIApXrE6xChQpRrVo1xo0bl7o+k4j3nnr16lE8n9X8ioiIiETUxo0212rlSltAuEOHoCMKXK5PsACOPfZYOnTowMaNG1MXxZX8rVixYlSpUkWjmiIiIiI5ZflyuOwyG8GaPBmaNQs6oqiQJxIsgJIlS1KyZMmgwxARERERyft++AGuusrmWc2cCfXqBR1R1Mj1TS5ERERERCSCPv3URqtKl4bZs5VcZaAES0REREREsuedd2wB4Vq1bAHhatWCjijqKMESEREREZED8x6efBK6doWLL4bp06FcuaCjikp5Zg6WiIiISJ6SlARf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1l2S6NWkiU1g6dDBWri//z4UiODx2a+/tp3HRx+FGjUi97oStby3irgdO+y0ffv+51u2WMfARo1sIPaAx2/694dRo6y5zt13R+x9hM2OHfYme/bMI6sl535KsEREJHLGj4ebbrLFfL//3tYykujXvn1aZ8Fq1eCJJyLzunv22E7jKafAvfdG5jUlIhISYOfOzJOjrBKn9JcTEg68/WLFbJB83DgoUeIgwdStaw8eOhT69o3uRbYzM3GitWhXeWDUUIIlIiI5LzkZHnvMRiHOOcd2CI4/Puio5FAMGLDvGllduuT8az7zjDXY+OYba7whUeevv2y06ECjSZndl9mScukVLGjri5cqlXZetaqdp78t43nK6ZBzpP79bXHeDz+E66477M8jEGPG2N+kli6IGmrTLiIiOevff23UasIE6NzZusFpZzl3SkiwRYSmT7d20BdfnHOv9euvULu2dUUbPTrnXkcO2e7dlocMGwazZ2f9uGOO2TfxOVBSlPG2okUjPN0uORlq1bIXnjcv98z127zZ5pENGGAHPySismrTrhEsERHJOevX23yrJUvgpZes/Ca37LjI/o46yvaszz0XrrnG9q5r1Qr/63hvpYFHHw0vvhj+7cthWbLEpimNGmXlfaecAk8/bVPjMiZKJUvmsulABQpAv37Wtv3bb63tYG7w4YeWHKo8MKpoBEtERHLGrFnQurXNDYiNhebNg45IwmX9ejj7bFtvZ84cKF8+vNv/4ANr//baa9CjR3i3LYfk33+t1fmwYfajLlzYcutu3axhXZ46XvLff7b2W+PG1j0zNzj3XMt2f/456EjyJS00LCIikfPuu9C0qR3KnjNHyVVeU7kyfPaZdYJs0eLgE2oOxfbtNpLQqJHtxUsgFi60QcQKFWy5un/+sTWeN260is0LLshjyRXYiGnPntbT/ddfg47m4NavtwNZGr2KOkqwREQkfBITbef4llvgwgstuapZM+ioJCc0aGAjkwsWWFOApKTwbPeBByxxe+ONXFZjlvvFxVkJ4FlnWYPP4cNtEPq772DpUqvwLVMm6ChzWM+eVgo7eHDQkRxcbKydd+gQbByyHyVYIiISHtu3WwOEwYPhjjtsXZZjjw06KslJLVrYz/uTT+DOO498e3PmWGLVpw/Uq3fk25OD8t56OnTrZr0SunWz7vhDh8Kff9oSaOeemwdH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8vLl1nBNyZXkmL59rVtNJOZDjR9vr6XywFxFI1giIpHQrZvteQfQQU2yLz7elmeaM8dGqH780daNAqvirFvXlnI6+2w7r1499yZRh+Lnn22x4kmTbJregAHQs2cw6616b80un302rSNgjx7qCCgR1qaNdaxZv97mxuaUpk1tTYXly/PHP5tcRiWCIiJB+e8/2/Nr2RJGjgw6Ggnx3pKn9MnUwoXWKAzgxBP3Tabq1w8moYgmc+fCgw9aglOxol2+5ZbINI7I2BGwYkWrmurWTR0BJQCzZtlaCq+9Zhl+Tti40f4RPfKInSTqKMESEQnKuHHQvr219b344qCjybfi4qykLCWZ+vFHa4oAljiddVZaMnX22daHRDL37bfwwAO2hleVKta/pVOnnOnV8u+/8Pbb+3YEvPtudQSUgHlv/yy2b7e2oTnRfGLQIFt7a+VKq4OVqKMES0QkKC1a2NDI779DTEzQ0eQLycm2z5M+mVq61G4H21f53//STmecYcuASfalLN774IO2cPKpp9oaWtdeG559zS1bbIrLq69am/tzz4V771VHQIkiY8dChw42SbNly/Bvv1Ej66ozf374ty1hcdjrYImIyBHYsgUmT4a77lJylYO2bt231O+nn+Cff+y+UqVsRKpNG0umGjWK3m54uYlz0Lw5XHYZTJxo62a1b2/z1B5/3DpLH86UkYwdAVu1shGrxo3D/x5Ejsg111hHmJdeCkXAr8kAACAASURBVH+CtWqV1eSqc2CupARLRCQnjRljRyBvuCHoSPKMvXttDs6PP6YlVatW2X0FCsCZZ1r5WMroVI0aGvHISc5Z8tqqlf26P/KIDdqecw488YR1XsyOefNssePx463U8MYb4c47bWRMJCoVLAh33GG/qPPnQ4MG4dv22LF23r59+LYpEaMSQRGRnJTyhasSj8O2eTN8913a6NT8+bBnj91XvrztyKckUw0a5GxDLzm4hAQbfXr8cdiwwRKsJ5+0n09GKR0Bn3vOFmk+5pi0joAVK0Y+dpFDtnOnNaJo0cI6xYbLGWfAscfaPz+JWloHS0Qk0n75BRYs0NpXhyEhwVqCt2hhzSbatrX5ON5be/CxY21K259/2ppH99wD55+v5CoaHHWUdfb77Tebo//zz5YEt2gBixfbYxIS4IMPoF49KzNcscJGr/74A555RsmV5CIlS8Ktt1ozoz/+CM82f/7ZJo1q7atcSyWCIiI5ZdQom3elL8lsW74c3n3Xutlv2WLd7e++G1q3trk96hqXexQpYuuxdu0KL79so1R161qitWSJJcinnWajXeoIKLlanz4weHDaL/qRGjPGvjvatj3ybUkgVCIoIpITkpJs8nP9+vDpp0FHE9Xi4uzg7zvvwA8/2LSGq66y9ZWaN8+Z1t8SeTt2WPOKV16BWrWsI+CVV2p+nOQR7dtbW80//oASJQ5/O97bCuannAJTpoQvPskRKhEUEYmk6dOtfk3lgZny3tZQuvlmm0fVtastJ/P88zZvZ+JES7KUXOUdpUrZvKzt2+1n36KFkivJQ+680+ZjDR9+ZNuZMwfWrrX275Jr6atLRCQnjBxptfktWgQdSVT56y/7aN59F379FYoXt/KwLl2sCcLhtPUWEQlco0bQpImVCt5+++EvyxEbC4ULW1205Fo6diQiEm67dsGECVYyUqRI0NEELiEhbR3OE0+EAQOgXDk70PvXX/DWW9YEQcmViORq/fvb6NOkSYf3/KQk6+BzxRV2gE5yLY1giYiE20cfwe7d+X7tqxUrbF5VSsOK8uVtveUuXWx6gYhIntKqFVSrZgsPX3PNoT9/5kzYtEmNkfIAJVgiIuE2ciRUrWrlIvlMSsOKd9+F2bPTGlZ06QKXX645VSKSh8XEWOvMPn1s0b7MFn87kDFjrG76qqtyJj6JGJUIioiE04YNtmLqjTfmm5q3lIYVXbpYW/WuXWHbtn0bVrRooeRKRPKBm2+2ji4vvXRoz9u710rLr74ajj46Z2KTiNHXnYhIOI0ebRlHPigP3LQJ3ntv34YVHTuqYYWI5GPFi8Ntt9kRprVrrZohO7780lpsqntgnqARLBGRcPHeygObNLF1TPKglIYVrVpBpUpqWCEisp9evWwNgqFDs/+c2FgoXRouuSTn4pKIUYIlIhIuCxbAsmV5cu2rFSvgnnusC+DVV8NPP1nDipUr4bvvoHNnO3ArIpLvVapkXWTfftvWxjqY3bvtyNW110KhQjkfn+Q4JVgiIuEycqStX9K2bdCRhEVcnHUBbNIETjsNBg2y0alPPoE//oBnnlE3QBGRTPXvb0t2vPXWwR/76afw77/qHpiHKMESEQmHhAT44APr5nDssUFHc9i8h1mz4JZb1LBCROSw1a8PF15oZYIJCQd+7JgxULEinHdeREKTnKcES0QkHKZMga1bc2154Jo18NxzNlJ17rnWar1jR2u1vmyZlQMef3zQUYqI5CL9+9tw/4QJWT9mxw6YPBnatbM275In6BikiEg4jBwJZctC8+ZBR5Itu3fDjBmWF06ZAr/9Zrefe641rrj2Ws2pEhE5IldeaXXUL75oc7Iy6/7z0UfWol3lgXmKEiwRkSO1fbvV0N92Gxx1VNDRZMp7a1SRklDNnAnx8bbcStOm0Ls3XHFFnm1+KCISeQUKQL9+0KOHLRaYWQlgbKz94z3rrMjHJzlGCZaIyJH68EPLVqKsPPCff2zN45Sk6vff7fbTToOePeHyy+37vkiRYOMUEcmzbrwRHnzQFh7OmGBt3gxTp8J992ltizxGCZaIyJEaORJOP90mNQfIe1iyJC2h+v57SEyEEiXg4ovh/vvhssvgpJMCDVNEJP8oWtRGsJ580mqxa9RIu+/DDyE5WeWBeZASLBGRI7F6tbXde+aZQI5AbtsG33xjc6S//NIW+wWoW9caUzRvbq3VtbSKiEhAbr/duggNGQKvvJJ2+5gxULs21KoVXGySI5RgiYgciVGjLLHq1CkiL5ecDPPnW0I1ZQrMmWO3HXssXHqpJVSXXWYt1kVEJAqUL2/fEcOHw2OPQenSVrM9e7aNbEmeowRLRORweW/lgRddBJUq5djLbNlio1NTpsBXX1k3eOdsTvSDD1pS1aiROvyKiEStfv0swXrzTZtzNXas3d6hQ7BxSY5QgiUicrhmzYK1a2HgwLBuNjERfvwxbS7V/Pl2e7ly1piieXMbrSpbNqwvKyIiOaV2bbjkEnj5ZbjzTisPPPtsqFYt6MgkByjBEhE5XKNG2QTmNm2OeFMbNqSNUn39NezcaSNS55wDTzxhiVXdutb1V0REcqE777QjZI8+CosWweDBQUckOUQJlojI4dizx0o8rrnmsFbkjY+3AbApU2w+1S+/2O0nnABt29p3cLNmUKpUmOMWEZFgXHqpdZx96ik7WtauXdARSQ5RgiUicjg+/dSGmQ5h7Svv4f33rTPvtGnw77+2LvH558NNN1lSVauWlkMREcmTnIP+/aFrV7jwQnUjysOUYImIHI6RI224qWnTbD/luedgwACoWjUtoWra9LAGwEREJDfq1MnmX/XtG3QkkoOUYImIHKotW6yu7847s926b/RoS646dLDLmkslIpIPFSliixdKnqavePn/9u47Pqoy++P451AVFBABFwEVUVQsizCxYVcUUEFdG3bXir2sK4hrW+xr+e0uYC8odiWiCSj2tVNE3IAF0UWwUEREkBae3x9ngiEESJmZe2fm+3698rrJnVvODCGZk+c85xGR6nriCSgthZNOqtLhr70Gp53mFSEPP6zkSkREJJfp17yISHUNGwZdusAOO6zz0E8+gSOOgG22gREjoGHDDMQnIiIikVGCJSJSHSUlMGFClZpbTJ8OvXpBkyZQXKyOgCIiIvlAc7BERKrj0Ud93lXfvms9bN48X7vq11/hnXegXbsMxSciIiKRUoIlIlJVpaXeZ71nT2jVao2HLV4Mhx8OU6f6Olc77pjBGEVERCRSKhEUEamqN96AmTPXWh64YoW3YH/7bXjkkWp1cRcREZEcUKUEy8x6mNnnZjbVzPqv4ZhjzGyymZWY2ePl9pea2cTkx8hy+9ub2YfJaz5lZg1q/3RERNJo2DBo2hQOO2yNh1x+OTz9NNx2m7dkFxERkfyyzgTLzOoCg4GeQCegr5l1qnDM1sAAoFsIYXug/Oppv4UQOic/epfbfwtwZwhhK2AecHrtnoqISBr9+is89xwcc4yvY1KJu+6CO+6ACy/0JbJEREQk/1RlBGsXYGoIYVoIYSnwJNCnwjFnAoNDCPMAQgiz1nZBMzNgf+DZ5K5HgMOrE7iISEY9/zwsWrTG8sBnnoFLL4Ujj/QkyyzD8YmIiEgsVCXBagN8W+7rGcl95XUEOprZu2b2gZn1KPfYemY2Lrm/LInaGPg5hLB8LdcEwMzOSp4/bvbs2VUIVyTHDB4MRUVRRyGPPgrt20O3bqs99PbbcOKJsMce3gOjbt0I4hMREZFYSFWTi3rA1sC+QF/gPjMrW/Fl8xBCAjgeuMvMOlTnwiGEe0MIiRBComXLlikKVyRL/PKLD4vcckvUkeS3GTPgtdd89KrC0FRJCfTpA1tuCSNHwvrrRxSjiIiIxEJVEqyZQPkVXNom95U3AxgZQlgWQvga+AJPuAghzExupwFvAjsDc4FmZlZvLdcUkdGjYelSX9i2tDTqaPLX8OEQApx00iq7Z870ju3rrQejRkHz5hHFJyIiIrFRlQRrLLB1sutfA+A4YGSFYwrx0SvMrAVeMjjNzDYys4bl9ncDJocQAvAGcFTy/FOAF2r5XERyz4gRvl24ED7/PNpY8lUI3j2wWzfo8PsA/C+/QK9evqDwqFGwxRbRhSgiIiLxsc4EKzlP6nzgZWAK8HQIocTMrjezsq6ALwNzzWwynjhdHkKYC2wHjDOzT5L7bw4hTE6ecwVwqZlNxedkPZDKJyaS9ZYs8blXe+zhX48dG208+WrCBJg8eZXRq6VLvZnF5MneWLBz5wjjExERkVipt+5DIIRQDBRX2Hd1uc8DcGnyo/wx7wE7ruGa0/AOhSJSmTffhAUL4Ior4IQTYNw4X8FWMmvYMGjQwNuz4wNap5/uU7IefhgOOija8ERERCReUtXkQkRSrbAQGjf2d/BdumgEKwrLlsETT0Dv3rDRRgBceaV3Chw0SPmuiIiIrE4JlkgcrVgBL7zweweFggKYONHf8EvmvPwyzJ69cu2rIUPg5pvh7LM90RIRERGpSAmWSBx99BF8/z0cnlw6LpHwOVklJdHGlW+GDYMWLaBHDwoL4fzz4bDD4N//1kLCIiIiUjklWCJxVFgI9ep5mzrwBAtUJphJ8+b5wlbHH8/74+rTty/ssgs8+aT/04iIiIhURgmWSBwVFsJ++62c90OHDtCsmTe6kMx45hlYsoT/7XMyhx0GbdvCiy9Co0ZRByYiIiJxpgRLJG6mTPE1r8rKA8Hr0RIJJViZNGwYy7fejv0u60KdOr7mc8uWUQclIiIicacESyRuCgt927v3qvsLCmDSJFi8OPMx5ZuvvoJ332XoopP5cZZRVLTKGsMiIiIia6QESyRuCgs9mWrbdtX9iQQsX+5JlqRV6SOPsQLj9u9P4Omn/Z9DREREpCqUYInEycyZ3kGwfHlgmbJGFyoTTKuwIjD3rmG8zv5cdU87Djkk6ohEREQkmyjBEomTkSN9e8QRqz/Wrh20aqVOgmn24Bnv0WrBNH7pczJnnBF1NCIiIpJt1GxYJE5GjICOHWHbbVd/TI0u0u7++6H0oWEsqdeIIx49MupwREREJAtpBEskLn7+Gd54w8sD17SKbSIBkyfDwoWZjS0PFBfDRWcv5oR6T1H/2D9hG24QdUgiIiKShZRgicRFcbE3sahs/lWZggJYsQI+/jhzceWBsWPh6KPh/M1fZIPl86lzyklRhyQiIiJZSgmWSFwUFsIf/gC77rrmY7p29a3KBFPmq6/gkEN8ett1Ww2DTTeF/fePOiwRERHJUkqwROJg8WIYNQr69IE6a/lv2bo1tGmjRhcpMns29Ojhg4Jjhs9ivTdGw4knQt26UYcmIiIiWUpNLkTi4LXX4Ndf114eWKagQCNYKbBoERx2GMyYAa+/DluNfdJLNE9SeaCIiIjUnEawROKgsBA23BD222/dxyYS8MUXMH9++uPKUcuXQ9++PhD4xBOw++7AsGHQpQvssEPU4YmIiEgWU4IlErXSUl//6pBDoGHDdR9fUODb8ePTG1eOCgEuuMBf8n/9KzloWFLir+fJJ0cdnoiIiGQ5JVgiUfvgA5g1q2rlgaBGF7V0001w993Qvz+ce25y56OP+ryrvn0jjU1ERESynxIskaiNGAH160PPnlU7fuONoX37WCRYy5dHHUH1DBsGAwd6H4sbb0zuLC2Fxx7zbhetWkUan4iIiGQ/NbkQiVIIPv/qgAOgSZOqn1dQAB99lL641qG0FAYN8o9mzWC77Vb/aNduzeslR2HMGDj9dH+pH3igXGxvvAEzZ8Idd0Qan4iIiOQGJVgiUSop8YWY/vrX6p2XSMDTT8OcOdCiRXpiW4Mff/QRoFdfhT/9CTbaCKZMgWefhZ9++v24xo1h221/T7g6dfJthw5QL8M/eSZO9Fg7dYLnnoMGDco9+Oij0LSptxQUERERqSUlWCJRKiz0oZTevat3XiLh23HjvLQtQ95+G447DubN81Gg0077fSQoBF9XasqUVT/efNMr8MrUrw9bb736iNc220CjRqmP+X//8+rLZs18qbGmTcs9+OuvnnEdfzysv37qby4iIiJ5RwmWSJRGjIDddoM//KF655VvdJGBBGvFCrj1Vp+/1KEDjB4NO+206jFmPoWpVSvYZ59VH1uwAD77zBOuyZN9O2mSP/0VK34/f/PNKy83bN68ZnH/9JO/PIsX+1Jjm25a4YARI2DhQnUPFBERkZRRgiUSlenTYcIEuOWW6p/bpIkP+WSg0cXcuZ5/FBf76NW99/qSXdWx4YY+baysw3yZJUvgyy9XH/V64w1Pisq0arVqwlVWbrjppmue57V4MfTpA9Om+fyrTp0qOWjYMG8Y0q1b9Z6QiIiIyBoowRKJygsv+Laq7dkrSiQ8E0mj99+HY4/1eVdDhsA556S2cUXDhr6ub8W1fUtLvbSvYuL15JPw88+/H7fhhpWPeG2+uc8Te+cdn6q2996V3HzGDB/WuvrqeHXjEBERkaymBEskKoWFPqzSsWPNzi8ogOHD4bvvKql9q50Q4K67vPdGu3bw3nu/VyVmQt26sOWW/nHIIavG9cMPqyder7wCjzyy6vmlpd4Y8Oij13CT4cP9gieemNbnIiIiIvlFCZZIFObOhbfegiuuqPk1yhpdjB+f0gRr3jz48589/zviCHjwQW8QEQdm0Lq1f+y//6qP/fzz7/O8pkzxvPWMM9ZwoRC8PHCPPWCrrdIet4iIiOQPJVgiUSgq8iGWmpYHAuy8M9SpA2PHpqzF+LhxcMwx8O23cOedcNFF2VM916yZ9wvZbbcqHPzxx95t4+670x6XiIiI5Jc6UQcgkpcKC6FNm9rV3TVqBNtvn5JGFyHA4MHe62H5cvjPf+Dii7Mnuaq2YcN8Maxjjok6EhEREckxSrBEMm3RIu9zfvjhPgJVG4mEJ1gh1PgSv/zi3QHPPx+6d/fBnSqNAmWrZcvg8cd97bGNNoo6GhEREckxSrBEMu3VV+G332pXHlimoMBX950+vUanf/KJ52jPPefd4keOhI03rn1Ysfbyy/6aae0rERERSQMlWCKZNmIENG26+mq8NVHW6KKaZYIhwP33+0jVwoXe7f2vf639gFpWGDYMWrTIyALNIiIikn/y4e2USHwsXw4vvgiHHgr169f+ejvt5NcZO7bKpyxcCKecAmeeCXvt5SWBe+1V+1Cywrx5PkzXt29qXn8RERGRCpRgiWTSu+96i/YjjkjN9Ro29CSriiNYkyd7VeFjj8H118OoUdCqVWpCyQrPPANLlqg8UERERNJGCZZIJhUWelJ08MGpu2YVG108+qgnV3Pnwpgx8Le/+YK8eeXRR2G77TK7arKIiIjkFSVYIpkSgs+/6t4dNtggdddNJGD+fJg6tdKHf/vNF9w9+WRPsCZOhAMOSN3ts8ZXX8E77/gLkbP950VERCRqSrAkc+bMgW228RbZ+eiTT+B//0tN98DyCgp8W0mZ4BdfeCOLBx6AgQO9gWHr1qm9fdZ47DFPrE44IepIREREJIcpwZLMue46f8d/1VXe7CHfFBZ6m77evVN73U6dYL31VkuwnnrKK+FmzoTiYhg0COrVS+2ts0YI3j1w//2hXbuooxEREZEcpgRLMuOzz2DoUOjcGb7+Gp58MuqIMq+wELp1g5YtU3vd+vVh551XdhJcsgTOO88XD95pJ+8S2LNnam+Zdd57D6ZNU3MLERERSTslWJIZl18OjRv7Iq877gg33QQrVkQdVeZ8/bWXCKa6PLBMIgETJjDty1K6dYMhQ+Avf4E339SADeCjV40awZFHRh2JiIiI5DglWJJ+r74KL73kpYGtWsGVV3q/8MLCqCPLnLLnms4Ea+FC+nb5nK++8tvddpuWegJg8WKvlzzyyNQ2FxERERGphBIsSa/SUrjsMmjfHi64wPcdfTRsvTXccMM6W4vnjMJCr9fbcsuUX3rpUrj5NW900avlWCZMgD59Un6b7PXSS95lUeWBIiIikgFKsCS9HnoIJk2CW27xRgzgiy/17w8TJnjJYK6bPdvbg6dh9Gr6dNhnHxg4rCOL62/AVT3G0b59ym+T3YYNg0039QYXIiIiImlWpQTLzHqY2edmNtXM+q/hmGPMbLKZlZjZ48l9nc3s/eS+SWZ2bLnjHzazr81sYvKjc2qeksTGggVeFrjHHnDUUas+duKJPjnoxhujiS2TXnrJ55ulOMEqLvbeFiUl8OTTdVlv9y7UnTA2pffIerNmwahR/v2Wd6sqi4iISBTWmWCZWV1gMNAT6AT0NbNOFY7ZGhgAdAshbA9cnHxoEXBycl8P4C4za1bu1MtDCJ2THxNr/3QkVm65BX78Ee68c/WFXRs08MYX//mPf+SyESNgs828g2IKLF8OAwbAIYf4ZceP96rLlasIL1uWkvvkhCef9BfspJOijkRERETyRFVGsHYBpoYQpoUQlgJPAhVneJwJDA4hzAMIIcxKbr8IIXyZ/Pw7YBaQ4h7VEkvTp8Ptt/uirrvsUvkxZ5zhTS9uuCGzsWXSr7/CK6/46FXFJLMGvvvOK91uvhnOOsu7j2+9dfLBRMJ7tJeU1Po+OWPYMOjSBXbYIepIREREJE9UJcFqA3xb7usZyX3ldQQ6mtm7ZvaBmfWoeBEz2wVoAHxVbvcNydLBO82sYWU3N7OzzGycmY2bPXt2FcKVWBgwwLdrKwFcf3249FKfh1Vhkdyc8cornvQccUStLzVmjA+CTZgAjz0G99zjL+FKiYRvx6pMEPBEc/x4jV6JiIhIRqWqyUU9YGtgX6AvcF/5UkAzaw08CpwWQihb/GgAsC1QADQHrqjswiGEe0MIiRBComWqF2iV9PjwQ3j8ce8euNlmaz+2Xz9o1ix352IVFkLz5rDnnjW+RGkpXHstHHywD/iNHesDg6vp0MFfy1xNVqvr0Ud93lXfvlFHIiIiInmkKgnWTKD8UqVtk/vKmwGMDCEsCyF8DXyBJ1yYWROgCBgYQvig7IQQwvfBLQEewksRJduF4KNSm2wCV1SaM6+qSRO48EKfp5RrpW3LlsGLL8Jhh0G9etU6NQRvvnjjjT616rrrvMv4hx/Cdtut4SQzH8VSguVZ6fDh0KOHfy+KiIiIZEhVEqyxwNZm1t7MGgDHASMrHFOIj15hZi3wksFpyeNHAMNCCM+WPyE5qoWZGXA48N9aPA+Ji2ef9YlBgwbBhhtW7ZwLL4TGjeGmm9IbW6a9/Tb8/HOVuwcuWuQNB/v184G/P/4RBg70QZhHHoGHH/aXaa0KCjwzW7y41uFntTffhBkztPaViIiIZNw6E6wQwnLgfOBlYArwdAihxMyuN7PeycNeBuaa2WTgDbw74FzgGGBv4NRK2rEPN7NPgU+BFsCglD4zybzFi33Uaqed4LTTqn7exhvDOefAE0/AtGnpiy/TCgt9ktRBB63xkOnTYehQ7wi48cY+2PXYY54nPfCAN7UYO7YaeUIi4V3zJk1KzXPIVsOH++joYYdFHYmIiIjkGQshRB1DlSUSiTBO5U/xdeutnmCNGQMHHli9c7//Htq3h1NO8e4N2S4EH4ZKJLz8Mam0FD74wEeqiorg0099f4cOcOihnmjtvTc0rLTlSxVMnw6bbw6DB8O559b+eWSjFSugdWs44ACfCygiIiKSBmY2PoSQqLi/ehNDRNZk1ixvt37oodVPrsDfEP/5zz5sc/XV0KZio8osM368l6gNGsS8eTB6tCdUo0bBTz/5lKy99oJ//MNfso4dU9LF3RdvLuuEka/GjfPvx0MOiToSERERyUNKsCQ1rr0WFi6E226r+TX++le4917POu68M2WhZVoIMOe+QjauU5fedx/K6NN95KpFi99HqQ46yBv+pZwaXXgmW6eON7gQERERybBUtWmXfFZS4mV9/frBttvW/DpbbAEnnujXyrI1zxYv9lGq88+HLbeEH+8t5M0VezNz8cb07w/vvw8//ODNKo45Jk3JVZlEAiZP9oQ3HxUVwW67+aQ2ERERkQxTgiW1d/nl3jHwmmtqf63+/T1bueuu2l8rzWbO9AG3Pn38vXzPnvDgg3BQ+y/ZgRK6XHc4H3/sDRV32827AWZEQYHPQ/r44wzdMEZ++MHLM3v1ijoSERERyVNKsKR2Xn7ZJxZdfbXXwNXWttvCn/4E//43zJ9f++ulUFmDir/9DXbeGdq2hbPPhk8+8aaJxcUwdy7c0+sFAJqd0ieaQLt29W0+lgmOGuVbzb8SERGRiKiLoNTc8uXQubOPOJWU1KL1XQUffwxdunjTjCuvTM01a2j+fHjlFa86Ky72ysU6daBbN38Pf+ih0KlThQYV3brBb7/BhAmRxU3btrDPPt6uPJ8cdZRnwd9+m6KuISIiIiKVUxdBSb0HHvDE6rnnUpdcgQ8P9erljS4uuqgKq+umTgjwxReeUL30EvznP55HbrSRlwAeeigcfDA0b76GC/zwg0+4uu66jMVcqYKC/BvBWrrUs+HjjlNyJSIiIpFRiaDUzC+/eK3cXnvBEUek/voDB8KcOXDffam/diW+/RYuucTbpW+7LVx2mY9W/eUvnmTNmuWDQX37riW5AnjxRc/SDj88I3GvUSLhmWLMyizT6p13YMEClQeKiIhIpDSCJTVz002egRQXp2e0YI89YN99ve17v36pHSGr4MMPvVHFzz/D/vt7onXIIb5eb7UVFnobwR12SHmc1VJQ4Nvx4/1J5YPiYmjQwBcYFhEREYmIRrCk+r75xsv3Tj7ZR0rS5cor4bvvvLd5mjz9tOdxjRv71K/iYjj33BomV7/8Aq++6qNXUZeo5WOji6Iin3e2wQZRRyIiIiJ5TAmWVF///t7p4YYb0nufAw/0kZhbbvGJUCkUAvz973DssZ4jfvghbLddLS86erTPA4q6PBC8b3z79vmTYE2bBp99pvJAERERiZwSLKme99+Hp57yta/atk3vYUWw/wAAIABJREFUvcx8Lta0aX7PFFmyxAffrr4aTjrJB51S0WGewkJo2dLLG+OgoADGjo06iswoKvKtEiwRERGJmBIsqboQfIJS69aeYGXCYYf5fKYbb/TFc2tp9myfovPYY74A8COPpGh619Kl/ia/d+8Mrii8DomEl3POmRN1JOlXVOQdSrbaKupIREREJM8pwZKqe+opr6W74YbMzXOpU8fnYk2eDC+8UKtLTZ4Mu+7qfR+eftoHx1I2VeqNN3wOVhzKA8uUzY/L9TLBhQvhzTe9tb+IiIhIxJRgSdX89htccYWvUXXKKZm999FHQ4cOntjVcGHsMWNg991h0SJ46y2/ZEoVFnqnjAMPTPGFayFfGl28/rrXfao8UERERGJACZZUzV13wfTpcPvtPqqUSfXqeWON8eN9IdlqGjrUFwneYgv46CPYZZcUx7dihY+u9ewJ662X4ovXQpMmsM02uZ9gFRX5iOree0cdiYiIiIgSLKmCH3/0OVB9+sB++0UTw8kne1ONG2+s8imlpXDxxd52vUcPX4d2s83SENvYsfD99/EqDyyTSOR2o4sQPMHq3t3XwBIRERGJmBIsWberr4bFi+HWW6OLoUEDb6zx9tueKa3DggWeD/7f/3lfjhdegA03TFNshYU+yhbHOUAFBb6W2HffRR1Jenz6KcyYofJAERERiQ0lWLJ2n34K998P553nXdqidMYZ3gZ9HetvTZ8O3br5slRDh8Idd6S5sd+IEb5a8UYbpfEmNVTW6GL8+GjjSJfiYt/27BltHCIiIiJJSrBkzUKAyy6Dpk19FCtqjRrBpZd65rSGhKFsjtX06TBqFJxzTppj+uwz+PxzOOKINN+ohnbe2efM5WqZYFGRP8dNN406EhERERFACZaszejR3n7vmmugefOoo3H9+nnCV8lcrKefhn328Tzs/fd9Wk7aFRb6tnfvDNysBho1gu23z81GFz/9BO+9p/JAERERiRUlWFK5Zct89GrrrT2piYumTeGCC+D5531hK3ygbdAgOPZYr4j78EPYbrsMxVNY6POc2rbN0A1rIJHwBKuGLe5j6+WXvYOjEiwRERGJESVYUrn77oMpU+C22+LXne2ii3xk5uabWbLEGwz+7W9w4onw6qs+TSsjZs70bC6O3QPLKyiA2bO9bjKXFBVBixb+/ERERERiQgmWrO7nn70scN9941n61qIFnHMO4fHHOanbNB57zEewhg2Dhg0zGMfIkb6N6/yrMmWNLnKpTLC01EtYe/RIcwcTERERkepRgiWru/FGmDvX2++ZRR1Npb7sfRlLS+vSfeKtPPUUDBwYQaiFhd5ZcdttM3zjatppJ6hfP7caXXz0kX+PqjxQREREYkYJlqxq2jRfPOrUU707WwyNGQMFfTblyfX/zOl1HuKYbjMzH8TPP8Prr3t5YEyT0JUaNvQkK5dGsIqKfOTq4IOjjkRERERkFUqwZFVXXOGL5g4aFHUklbr7bl/yaLPN4MBX/kqdFaVw++2ZD6S4GJYvj//8qzK51uiiqAj22COea4+JiIhIXlOCJb975x149llPsmK2rlBpKVxyiTc07NED3n0X2uzZHo4/Hu65B+bMyWxAhYXwhz/Arrtm9r41lUjA/PkwdWrUkdTezJkwcaLKA0VERCSWlGCJW7HCF/Ft08bbs8fIggU+UHTXXXDxxfDCC7DhhskHBwyA337zssZMWbzYVzHu08cX8c0GZZ32cqFMcNQo3/bqFW0cIiIiIpXIkneHknZPPOFNEG66CRo3jjqalaZPhz339PfUQ4fCnXdWaBq33XZw5JHwr3/5CE0mvP46/Ppr9pQHAnTqBOutlxsJVlERtGsHO+wQdSQiIiIiq1GCJbBoEfTvD127wgknRB3NSh99BLvsAt9841OezjlnDQdeeaUnV0OGZCawwkIfQttvv8zcLxXq1/emJdneSXDJEu9ycsgh8W8uIiIiInlJCZZ4O/YZM3wbk5K3Z56Bffbx9YTffx8OOmgtB3fp4hOz7rzTk8V0Ki31GsVevTK86FYKJBIwYYI/h2z19tuwcKHmX4mIiEhsxePdtETn++/h5pu9zG7vvaOOhhDghhvgmGN8QO3DD726bZ0GDoTZs+G++9Ib4AcfwKxZ8V9cuDKJhCcnn38edSQ1V1Tkie3++0cdiYiIiEillGDlu7/9DZYuhVtuiToSliyBU06Bq66CE0+E116Dli2rePKee3qCeNttfqF0KSz0cruePdN3j3Qpa3SRzWWCRUVemtmoUdSRiIiIiFRKCVY+++QTePBBuPBC2GqrSEOZMwcOPBAefRT+/ncYNqwGFXgDB3oL72HD0hIjIcCIEXDAAdCkSXrukU4dO8IGG2Rvo4svv/Q28yoPFBERkRhTgpWvQvC27M2b+5BRhD77zJeTGjcOnnrKw6lR/4Lu3b0M7pZbfBHgVCspga++yq7ugeXVrevz1bJ1BKuoyLdKsERERCTGlGDlq6Iibzd+7bXQrFlkYbz6Kuy2m08NevNNn3tVY2Y+ivXVV/D006kK8XeFhX6PPn1Sf+1MKSjwRXqXLYs6kuorKvK2/O3bRx2JiIiIyBopwcpHy5bBX/4C22wDZ58dWRj33OPN/zbbzJtZ7LprCi7auzdsvz3ceKMvnpxKhYWeDf7hD6m9biYlEj5HraQk6kiqZ8ECeOstjV6JiIhI7CnBykd33+2d5P7xD2/YkGGlpV6deM45cPDB8M47sPnmKbp4nTowYIAnECNHpuiiwLffwvjx2VseWCaR8G22lQm++qr/YaBXr6gjEREREVkrJVj5Zt48Lws88MBIRgMWLPAc5c474aKLPAdKeb+IY4+FLbf0fu8hpOaaL7zg22xPsDp08JLQbGt0UVzs3yh77hl1JCIiIiJrpQQr3wwa5EnW7bfXsJNEzU2d6u+PR42CIUPgrru870LK1asH/ft7EjFmTGquOWKEL8jVsWNqrhcVMx/FyqYEKwRPsA46KJIRVxEREZHqUIKVT6ZOhX/9C04/HXbaKaO3fu45Xzj422/9vXK/fmm+4cknQ5s2Phertn76yef/ZPvoVZlEAiZNgsWLo46kaiZOhO++0/wrERERyQpKsPLJX/8KDRr4QlMZsnSplwIedZQPAE2c6AMRadewoTfyeOstePfd2l2rqMgnjuVKglVQ4G3sJ02KOpKqKWvPno2LO4uIiEjeqVKCZWY9zOxzM5tqZv3XcMwxZjbZzErM7PFy+08xsy+TH6eU29/VzD5NXvOfZhmuV8s3b73lZW4DBmSsC94338Bee8E//wmXXOIhbLZZRm7tzjwTWrTwuVi1UVjoo2Fdu6YmrqiVNbrIljLBoiJPCjfZJOpIRERERNZpnQmWmdUFBgM9gU5AXzPrVOGYrYEBQLcQwvbAxcn9zYFrgF2BXYBrzGyj5GlDgTOBrZMfPVLxhKQSK1Z427527XybASNHws47e7PC55+HO+7wwbOMatzYM7tRo2DChJpd47ffYPRoX/uqTo4M+LZrB61aZUcnwTlzvIe/ugeKiIhIlqjKO8ZdgKkhhGkhhKXAk0DFlVbPBAaHEOYBhBBmJfcfDIwJIfyUfGwM0MPMWgNNQggfhBACMAzIkfqrGHrsMU8wbr4Z1l8/rbdatswrEfv08UZ+EybAEUek9ZZrd9550LRpzedijRkDixZF/CRSLJsaXYwe7U0uNP9KREREskRVEqw2wLflvp6R3FdeR6Cjmb1rZh+YWY91nNsm+fnargmAmZ1lZuPMbNzs2bOrEK6sYuFCuPJK2GUXOO64tN5qxgzYd1+47TY491yf+rTllmm95bo1bQrnn+/DaFOmVP/8wkK/xj77pD62KCUSMHmyf3/EWVGRlwbmSnmmiIiI5LxU1TzVw8v89gX6AveZWbNUXDiEcG8IIRFCSLRs2TIVl8wv//gHzJzpNXppLHEbPdpLAidNgieegMGDYb310na76rn4Yh+5u/nm6p23fLnXOh56aO61By8o8NLRjz+OOpI1W77cv7F69syd8kwRERHJeVV51zITaFfu67bJfeXNAEaGEJaFEL4GvsATrjWdOzP5+dquKbU1cybceiscfTR065aWWyxfDldd5VNkWrf2qrM0D5RVX4sWcNZZMHw4fP111c97912YOzd3ugeWVzYiFOcywfffh59/VnmgiIiIZJWqJFhjga3NrL2ZNQCOA0ZWOKYQH73CzFrgJYPTgJeBg8xso2Rzi4OAl0MI3wO/mNluye6BJwMvpOIJSTlXXeUZUHVHbqro+++he3dv0vfnP3svgm22Scutau8vf/FVjW+9ternFBZ6u/ceOdh/pXVr74wY50YXxcW+aHT37lFHIiIiIlJl60ywQgjLgfPxZGkK8HQIocTMrjez3snDXgbmmtlk4A3g8hDC3BDCT8Df8SRtLHB9ch/AucD9wFTgK2BUCp+XTJgAjzzi5XFpmAj1+uteEvjRR36b++9Pe/+M2mnTBk49FR580BetXZcQPMHq3h022CDt4UWioCDeI1hFRbDnnj4HTkRERCRLVGliQwihOITQMYTQIYRwQ3Lf1SGEkcnPQwjh0hBCpxDCjiGEJ8ud+2AIYavkx0Pl9o8LIeyQvOb5yW6CkgohwGWXwcYbe4OLFFqxwtcp7t4dmjf3BOvkk1N6i/S54gpfMPj229d97KRJvpBXLpYHlkkk4IsvYP78qCNZ3fTp8OmnKg8UERGRrKOZ47lo5Eh48024/vqU/vV/9mzvN3D11XD88Z5cbb99yi6ffltuCX37wt13+/pKa1NY6I0VDjssM7FFoWzB4fHjo42jMsXFvlWCJSIiIllGCVYuGjTIJ0OdeWbKLvnOO14S+NZbcN99MGxYllbO9e/v61r9859rP27ECG8M0qpVZuKKQlmCFccywaIiaN8ett026khEREREqkUJVq4ZO9bfMF94oTcIqKUVK7wvxL77+hyrDz6AM87wtWqz0vbb+6LB//oX/PJL5cd8/TV88klulweCl5C2bx+/BGvxYnjtNW9NmbXfaCIiIpKvlGDlmiFDfGjpxBNrfamffoI+fXzq0pFHeiVZ584piDFqAwd6++8hQyp//IVkQ8s+fTIXU1QKCuLXSfDNN+G331QeKCIiIllJCVYumTsXnnwSTjoJmjSp1aU+/NBLAl9+Gf79b3jqqVpfMj66doWDD/bFlxctWv3xwkLYcUfo0CHzsWVaIuHNPNY1Jy2Tiop8uHTffaOORERERKTalGDlkocf9vKqfv1qfIkQ4P/+D/bay3s8vPcenHdeDlZqDRzoXTvuv3/V/bNnw3/+42WE+SBujS5C8ATrgANi3vdfREREpHJKsHLFihUwdKhnRjvuWKNLzJ8PRx3lS2f16uVLaZW9/845e+3lH7fdBkuX/r7/pZf8tcz1+Vdlunb1bVzKBD/7zOfAqTxQREREspQSrFwxZgx89VWNR68mTIAuXbzD++23exO9jTZKcYxxc+WVMGMGPPro7/sKC2GzzXJkslkVNGniHSfj0uiirD17r17RxiEiIiJSQ0qwcsXQod5S/Mgjq3VaCL4s1O67+0DO22/DpZfmYElgZQ4+2Edwbr4Zli+HhQvhlVd89CovXoCkRCI+I1hFRbDDDp7kioiIiGQhJVi5YPp0ePFF75/esGGVT1uwAE44wQe9DjgAPv7YE628YeajWFOnwjPPeEePxYvzZ/5VmYIC+O47/4jS/Pk+/03lgSIiIpLFar9QkkTv3nt9e9ZZVT7l0099vtXUqXDjjd6KvU4+ptuHHw6dOvmL8Mc/QvPmsOeeUUeVWeUbXWy6aXRxjBnjI4lKsERERCSL5eNb6tyydCncdx8ceihsvnmVTnnoIdhlFx/Bev11GDAgT5Mr8Cc+YAD897/wxBNw2GEpWaA5q3Tu7K9D1GWCRUXQrFmeDaOKiIhIrsnXt9W54/nnYdYsOPfcdR66cCGceir8+c/QrZuXBO6zT/pDjL3jjoP27fOre2B5jRvD9ttH2+hixQpvcHHwwfmX4IqIiEhOUYKV7YYM8QVxu3df62FTpsCuu8KwYXDNNT7daJNNMhRj3NWrBzfd5KWCBx0UdTTRSCQ8wQohmvtPmOB/KFB5oIiIiGQ5JVjZ7L//9aYA55yz1hq/4cO9j8GsWZ5YXXst1K2buTCzwrHHQkkJNGoUdSTRKCjwRZanT4/m/kVF3nSkR49o7i8iIiKSIkqwstnQod418LTTKn34t9/g7LPhxBO9G/nEiesc6JJ8VdboIqoywaIiH2Jt2TKa+4uIiIikiBKsbLVggdf7HXccbLzxag9/+aX3Crj3Xu/h8Npr0TaIk5jbaSeoXz+aBOvHH73BhsoDRUREJAdoNnm2euwx+PXXSptbvPwyHH20v18uKoJevSKIT7JLw4aeZEXRSXDUKN/qG1VERERygEawslEI3tyia1efO1PO4sW+3vBmm3mXQL1nlSqLqtFFcTG0bg0775zZ+4qIiIikgRKsbPTOO97gol8/bwxQzv33w4wZ8M9/epIlUmWJBMyf76tPZ8qyZT7k2qvXat/LIiIiItlICVY2GjIEmjaFvn1X2f3bb3DjjbD33rDffhHFJtmrbDQ0k/Ow3n0XfvlF869EREQkZyjByjY//gjPPeedAyu0FL/3Xvj+e7j+eg0GSA106gTrrZfZBKuoyCcLHnhg5u4pIiIikkZKsLLNAw94WdU556yye9EiXyt3v/1gn30iik2yW/360LlzZhtdFBX5kOuGG2buniIiIiJppAQrm5SWwt13+1/7t9lmlYfuvtsHt667LqLYJDcUFMCECf69lm5ffw1Tpqg8UERERHKKEqxsUlQE3367Wmv2hQvh5pt9EeG99oooNskNiYR/Q33+efrvVVzsWyVYIiIikkOUYGWTIUOgTRs47LBVdg8eDLNna/RKUqCs0UUmygSLimCrraBjx/TfS0RERCRDlGBli6lTvZ31WWdBvd/Xh16wAG69FXr0gN13jzA+yQ0dO8IGG6S/0cWiRfDGGxq9EhERkZyjBCtb3H23J1ZnnLHK7n//G+bO1eiVpEjdutClS/oTrNdf91WxtRK2iIiI5BglWNngt9/goYfgiCNg001X7v7lF7jtNh8E2GWXCOOT3FJQABMnerfKdCkuhsaN1fJSREREco4SrGzw9NPw00+rNbf45z9h3jyNXkmKJRI+ulRSkp7rh+Dzrw48EBo2TM89RERERCKiBCsbDBkC2223yl/7f/4Zbr8deveGrl0jjE1yTyLh23Q1uigpgenTNf9KREREcpISrLgbNw4++shHr8xW7v6///Mk69prowtNclSHDtCsWfrmYRUV+Vbzr0RERCQHKcGKu6FDoVEjOOmklbvmzYM77oAjj4Sdd44wNslNZj6Klc4E649/9CUHRERERHKMEqw4mzcPnngCTjwRmjZdufuOO7zBxTXXRBib5LZEAiZN8rlYqTRvHrz3nsoDRUREJGcpwYqzRx7xDoL9+q3cNXeulwcefTTstFOEsUluKyiA5cs9yUqlV16B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\n",
            "text/plain": [
              "<Figure size 864x864 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "C6oe8cu2PIPc"
      },
      "source": [
        "Prepare Testing Data"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qLANKo8ebfnZ",
        "outputId": "88d713c7-89b4-4305-8a3e-17485c6a795e",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        }
      },
      "source": [
        "df_test.head()\n"
      ],
      "execution_count": 50,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>filename</th>\n",
              "      <th>category</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>10617</th>\n",
              "      <td>nonrumor_images/593793e5gw1eyx00y4yy9j20c80gb0...</td>\n",
              "      <td>nonrumor</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10618</th>\n",
              "      <td>nonrumor_images/4e5b54d8gw1eyk1do25yrj20c80gb7...</td>\n",
              "      <td>nonrumor</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10619</th>\n",
              "      <td>nonrumor_images/60718250jw1eyt39bfwvrj20b4079t...</td>\n",
              "      <td>nonrumor</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10620</th>\n",
              "      <td>nonrumor_images/470bf257gw1eyfbota55tj21kw247t...</td>\n",
              "      <td>nonrumor</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10621</th>\n",
              "      <td>rumor_images/55b843c4gw1dxs6tpbauvj.jpg</td>\n",
              "      <td>rumor</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                                filename  category\n",
              "10617  nonrumor_images/593793e5gw1eyx00y4yy9j20c80gb0...  nonrumor\n",
              "10618  nonrumor_images/4e5b54d8gw1eyk1do25yrj20c80gb7...  nonrumor\n",
              "10619  nonrumor_images/60718250jw1eyt39bfwvrj20b4079t...  nonrumor\n",
              "10620  nonrumor_images/470bf257gw1eyfbota55tj21kw247t...  nonrumor\n",
              "10621            rumor_images/55b843c4gw1dxs6tpbauvj.jpg     rumor"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 50
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "9UBNf5qQbtip"
      },
      "source": [
        "df_test = df_test.reset_index(drop = True)"
      ],
      "execution_count": 51,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qgwp88LEPEJI",
        "outputId": "b3f63bea-4fd1-4229-966b-2b3323be956c",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "test_filenames = []\n",
        "test_categories = []\n",
        "for i in range(0,len(df_test)):\n",
        "  test_filenames.append(df_test['filename'][i])\n",
        "  test_categories.append(df_test['category'][i])\n",
        "print(len(test_filenames))"
      ],
      "execution_count": 52,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "2655\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "oroYR9nFPKaX"
      },
      "source": [
        "test_df = df_test\n",
        "nb_samples = test_df.shape[0]"
      ],
      "execution_count": 53,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ke2CJfEzeQxk"
      },
      "source": [
        "Create Testing Generator"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Au0hQBuDPMi3",
        "outputId": "3eafb416-0b84-48f8-9245-a983ef3037e9",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "test_gen = ImageDataGenerator(rescale=1./255)\n",
        "test_generator = test_gen.flow_from_dataframe(\n",
        "    test_df, \n",
        "    \"./train_extracted/MM17-WeiboRumorSet/\", \n",
        "    x_col='filename',\n",
        "    y_col=None,\n",
        "    class_mode=None,\n",
        "    target_size=IMAGE_SIZE,\n",
        "    batch_size=batch_size,\n",
        "    shuffle=False,\n",
        "    validate_filenames=False\n",
        ")"
      ],
      "execution_count": 54,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Found 2655 non-validated image filenames.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4QrM6f9seki3"
      },
      "source": [
        "Predict"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xaL3pLJ2eT-x"
      },
      "source": [
        "predict = model.predict(test_generator, steps=np.ceil(nb_samples/batch_size))"
      ],
      "execution_count": 55,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "amQMkq5kemlx",
        "outputId": "83de3e4e-8b97-4562-ea7c-31aeb19308ce",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "print(predict)"
      ],
      "execution_count": 56,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[[0.4276789  0.5723211 ]\n",
            " [0.5081447  0.49185532]\n",
            " [0.3001609  0.6998391 ]\n",
            " ...\n",
            " [0.30766356 0.69233644]\n",
            " [0.38093075 0.6190692 ]\n",
            " [0.6424906  0.35750943]]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cCw8FByKeqYS"
      },
      "source": [
        "For categoral classication the prediction will come with probability of each category. So we will pick the category that have the highest probability with numpy average max"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "kfp83CZ6eoFA"
      },
      "source": [
        "test_df['category_predicted'] = np.argmax(predict, axis=-1)"
      ],
      "execution_count": 57,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UBRiP8lvevMY"
      },
      "source": [
        "We will convert the predict category back into our generator classes by using train_generator.class_indices. It is the classes that image generator map while converting data into computer vision"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JZ-sNkxResjR"
      },
      "source": [
        "label_map = dict((v,k) for k,v in train_generator.class_indices.items())\n",
        "test_df['category_predicted'] = test_df['category_predicted'].replace(label_map)"
      ],
      "execution_count": 58,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "A3bZxpsKggzh"
      },
      "source": [
        "From our prepare data part. We map data with {1: 'rumor', 0: 'nonrumor'}. Now we will map the result back to rumor is 1 and nonrumor is 0"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "V0zaVoW2exJx"
      },
      "source": [
        "test_df['category_predicted'] = test_df['category_predicted'].replace({ 'rumor': 1, 'nonrumor': 0 })\n",
        "test_df['category'] = test_df['category'].replace({ 'rumor': 1, 'nonrumor': 0 })"
      ],
      "execution_count": 59,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CpR5BXrngknH"
      },
      "source": [
        "Virtaulize Result"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "n3NO-gkEgiwd",
        "outputId": "2fc9fe4d-7c57-4908-97a6-c0bfc6fa184a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 279
        }
      },
      "source": [
        "test_df['category_predicted'].value_counts().plot.bar()"
      ],
      "execution_count": 60,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.axes._subplots.AxesSubplot at 0x7fd5a6373e10>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 60
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JIFDmAJpj36U",
        "outputId": "b40d6133-b030-40dc-f08e-680034500201",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 279
        }
      },
      "source": [
        "test_df['category'].value_counts().plot.bar()"
      ],
      "execution_count": 61,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.axes._subplots.AxesSubplot at 0x7fd5a6351860>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 61
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "F8Vgbm5Oj6re"
      },
      "source": [
        "y_pred = test_df['category_predicted']\n",
        "y_true = test_df['category']"
      ],
      "execution_count": 62,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Fl5UHyHCbf_M",
        "outputId": "d1c8ae01-b3ba-429d-eb74-9c351edfca5d",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "from sklearn.metrics import accuracy_score # normal accuracy\n",
        "from sklearn.metrics import balanced_accuracy_score # used in case of imbalanced data sets, average of recall, from 0 to 1\n",
        "from sklearn.metrics import confusion_matrix # division of performance on the multilabels\n",
        "from sklearn.metrics import cohen_kappa_score # compares model against random prediction, from -1 to 1\n",
        "from sklearn.metrics import classification_report # for multilabel classification, gives precision, recall, f score, support, more\n",
        "target_names = ['class 0', 'class 1']\n",
        "\n",
        "def print_metrics(y_true, y_pred):\n",
        "    print(\"Accuracy:\", accuracy_score(y_true, y_pred))\n",
        "    print(\"Balanced Accuracy:\" , balanced_accuracy_score(y_true, y_pred))\n",
        "    print(\"Confusion Matrix:\\n\", confusion_matrix(y_true, y_pred))\n",
        "    print(\"Cohen Kappa Score:\", cohen_kappa_score(y_true, y_pred))\n",
        "    print(\"Classification Report:\\n\", classification_report(y_true, y_pred, target_names=target_names))\n",
        "    \n",
        "print('CNN Only')\n",
        "print_metrics(y_true, y_pred)"
      ],
      "execution_count": 63,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "CNN Only\n",
            "Accuracy: 0.7344632768361582\n",
            "Balanced Accuracy: 0.7250624003145467\n",
            "Confusion Matrix:\n",
            " [[ 736  361]\n",
            " [ 344 1214]]\n",
            "Cohen Kappa Score: 0.45115916977845805\n",
            "Classification Report:\n",
            "               precision    recall  f1-score   support\n",
            "\n",
            "     class 0       0.68      0.67      0.68      1097\n",
            "     class 1       0.77      0.78      0.77      1558\n",
            "\n",
            "    accuracy                           0.73      2655\n",
            "   macro avg       0.73      0.73      0.73      2655\n",
            "weighted avg       0.73      0.73      0.73      2655\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kzYktfpVgo7v"
      },
      "source": [
        "See predicted result with images"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "NninvD-ebAX3",
        "outputId": "00953c29-cef1-4f89-9679-e3223fb30d62",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 17
        }
      },
      "source": [
        "# saving the dataframe of our results\n",
        "test_df.to_csv('2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020test_df_5331.csv') \n",
        "files.download('2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020test_df_5331.csv')"
      ],
      "execution_count": 64,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "\n",
              "    async function download(id, filename, size) {\n",
              "      if (!google.colab.kernel.accessAllowed) {\n",
              "        return;\n",
              "      }\n",
              "      const div = document.createElement('div');\n",
              "      const label = document.createElement('label');\n",
              "      label.textContent = `Downloading \"${filename}\": `;\n",
              "      div.appendChild(label);\n",
              "      const progress = document.createElement('progress');\n",
              "      progress.max = size;\n",
              "      div.appendChild(progress);\n",
              "      document.body.appendChild(div);\n",
              "\n",
              "      const buffers = [];\n",
              "      let downloaded = 0;\n",
              "\n",
              "      const channel = await google.colab.kernel.comms.open(id);\n",
              "      // Send a message to notify the kernel that we're ready.\n",
              "      channel.send({})\n",
              "\n",
              "      for await (const message of channel.messages) {\n",
              "        // Send a message to notify the kernel that we're ready.\n",
              "        channel.send({})\n",
              "        if (message.buffers) {\n",
              "          for (const buffer of message.buffers) {\n",
              "            buffers.push(buffer);\n",
              "            downloaded += buffer.byteLength;\n",
              "            progress.value = downloaded;\n",
              "          }\n",
              "        }\n",
              "      }\n",
              "      const blob = new Blob(buffers, {type: 'application/binary'});\n",
              "      const a = document.createElement('a');\n",
              "      a.href = window.URL.createObjectURL(blob);\n",
              "      a.download = filename;\n",
              "      div.appendChild(a);\n",
              "      a.click();\n",
              "      div.remove();\n",
              "    }\n",
              "  "
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "download(\"download_572fb69b-f02c-41ea-af7f-07223bd9b727\", \"2_Conv_layers_1_COMP5331_Initial_Full_Classifier_Ayush_10102020test_df_5331.csv\", 156304)"
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "EuGiE__EpTAU"
      },
      "source": [
        ""
      ],
      "execution_count": 64,
      "outputs": []
    }
  ]
}